@tryty/easydc-js 0.0.0-stage → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +797 -2
- package/examples/advanced/lanjutan.js +60 -0
- package/examples/basic.js +100 -0
- package/examples/commands/ping.js +6 -0
- package/examples/commands/profil.js +28 -0
- package/index.d.ts +129 -0
- package/package.json +32 -4
- package/src/bot.js +776 -0
- package/src/context.js +218 -0
- package/src/database.js +73 -0
- package/src/errors.js +38 -0
- package/src/functions/actions.js +103 -0
- package/src/functions/components.js +108 -0
- package/src/functions/control.js +142 -0
- package/src/functions/embed.js +71 -0
- package/src/functions/eval.js +73 -0
- package/src/functions/helpers.js +86 -0
- package/src/functions/index.js +29 -0
- package/src/functions/info.js +117 -0
- package/src/functions/interact.js +63 -0
- package/src/functions/manage.js +171 -0
- package/src/functions/messages.js +128 -0
- package/src/functions/text.js +118 -0
- package/src/functions/vars.js +37 -0
- package/src/index.js +19 -0
- package/src/interpreter.js +88 -0
- package/src/parser.js +168 -0
- package/src/util.js +188 -0
package/README.md
CHANGED
|
@@ -1,3 +1,798 @@
|
|
|
1
|
-
#
|
|
1
|
+
# easydc-js
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Bot Discord **super mudah** di atas [discord.js](https://discord.js.org). Kamu cukup menulis perintah dengan sintaks `$fungsi[argumen]` seperti aoi.js, tanpa harus mengurus event, embed, tombol, atau database secara manual.
|
|
4
|
+
|
|
5
|
+
```js
|
|
6
|
+
const { Bot } = require('easydc-js');
|
|
7
|
+
|
|
8
|
+
const bot = new Bot({ token: process.env.TOKEN, prefix: '!' });
|
|
9
|
+
|
|
10
|
+
bot.command({ name: 'ping', code: '🏓 Pong! $ping ms' });
|
|
11
|
+
|
|
12
|
+
bot.connect();
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Ketik `!ping` di Discord → bot menjawab `🏓 Pong! 42 ms`.
|
|
16
|
+
|
|
17
|
+
> **Catatan:** ini package independen, bukan bagian resmi dari discord.js maupun aoi.js. Package ini memakai discord.js di belakang layar.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Daftar isi
|
|
22
|
+
|
|
23
|
+
1. [Instalasi](#1-instalasi)
|
|
24
|
+
2. [Membuat bot di Discord](#2-membuat-bot-di-discord)
|
|
25
|
+
3. [Bot pertama](#3-bot-pertama)
|
|
26
|
+
4. [Cara kerja sintaks `$fungsi`](#4-cara-kerja-sintaks-fungsi)
|
|
27
|
+
5. [Jenis handler](#5-jenis-handler)
|
|
28
|
+
6. [Opsi Bot](#6-opsi-bot)
|
|
29
|
+
7. [Variabel & database](#7-variabel--database)
|
|
30
|
+
8. [Kondisi `$if`](#8-kondisi-if)
|
|
31
|
+
9. [Embed, tombol, select menu](#9-embed-tombol-select-menu)
|
|
32
|
+
10. [Fitur lanjutan: modal, autocomplete, menu klik-kanan, poll, thread, webhook](#10-fitur-lanjutan)
|
|
33
|
+
11. [Eval (khusus owner)](#11-eval-khusus-owner)
|
|
34
|
+
12. [Membuat fungsi sendiri](#12-membuat-fungsi-sendiri)
|
|
35
|
+
13. [Memisah command ke banyak file](#13-memisah-command-ke-banyak-file)
|
|
36
|
+
14. [Keamanan](#14-keamanan)
|
|
37
|
+
15. [Pemecahan masalah](#15-pemecahan-masalah)
|
|
38
|
+
16. [Daftar semua fungsi](#16-daftar-semua-fungsi)
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 1. Instalasi
|
|
43
|
+
|
|
44
|
+
Butuh **Node.js 18.17 atau lebih baru**.
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm install easydc-js discord.js
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 2. Membuat bot di Discord
|
|
51
|
+
|
|
52
|
+
1. Buka <https://discord.com/developers/applications> → **New Application**.
|
|
53
|
+
2. Menu **Bot** → **Reset Token** → salin token. **Jangan dibagikan ke siapa pun.**
|
|
54
|
+
3. Di halaman yang sama, aktifkan **Privileged Gateway Intents**:
|
|
55
|
+
- **Message Content Intent** (wajib agar command berawalan `!` terbaca)
|
|
56
|
+
- **Server Members Intent** (untuk event member masuk/keluar & info member)
|
|
57
|
+
4. Menu **OAuth2 → URL Generator** → centang `bot` dan `applications.commands` → pilih izin yang dibutuhkan → buka URL hasilnya untuk mengundang bot.
|
|
58
|
+
|
|
59
|
+
Simpan token di variabel lingkungan, jangan ditulis di kode:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Linux / macOS
|
|
63
|
+
TOKEN="token_kamu" node index.js
|
|
64
|
+
# Windows PowerShell
|
|
65
|
+
$env:TOKEN="token_kamu"; node index.js
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 3. Bot pertama
|
|
69
|
+
|
|
70
|
+
Buat `index.js`:
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
const { Bot } = require('easydc-js');
|
|
74
|
+
|
|
75
|
+
const bot = new Bot({
|
|
76
|
+
token: process.env.TOKEN,
|
|
77
|
+
prefix: '!',
|
|
78
|
+
timezone: 'Asia/Jakarta',
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
bot.variables({ uang: 100 });
|
|
82
|
+
|
|
83
|
+
bot.command({
|
|
84
|
+
name: 'uang',
|
|
85
|
+
code: '💰 $username punya $getUserVar[uang] koin',
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
bot.command({
|
|
89
|
+
name: 'kerja',
|
|
90
|
+
code: `
|
|
91
|
+
$cooldown[1m;Istirahat dulu, tunggu %time%.]
|
|
92
|
+
$setUserVar[uang;$math[$getUserVar[uang]+25]]
|
|
93
|
+
Kamu dapat 25 koin! Total: $getUserVar[uang]
|
|
94
|
+
`,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
bot.connect();
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Contoh lengkap ada di [`examples/basic.js`](examples/basic.js).
|
|
101
|
+
|
|
102
|
+
## 4. Cara kerja sintaks `$fungsi`
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
$namaFungsi[argumen1;argumen2;...]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- Argumen dipisah dengan **titik koma** `;`.
|
|
109
|
+
- Fungsi boleh **bersarang**: `$toUpperCase[$username]`, `$math[$getUserVar[uang]*2]`.
|
|
110
|
+
- Nama fungsi **tidak peka huruf besar/kecil** (`$Username` = `$username`).
|
|
111
|
+
- Fungsi yang tidak butuh argumen ditulis tanpa kurung: `$ping`, `$serverName`.
|
|
112
|
+
- Hasil akhir seluruh teks (setelah semua `$fungsi` dijalankan) dikirim sebagai jawaban bot.
|
|
113
|
+
- Teks yang panjangnya lebih dari 2000 karakter otomatis dipecah jadi beberapa pesan.
|
|
114
|
+
|
|
115
|
+
### Menulis karakter khusus
|
|
116
|
+
|
|
117
|
+
Untuk menulis karakter `$ [ ] ;` sebagai teks biasa, beri backslash di depannya:
|
|
118
|
+
|
|
119
|
+
| Tulis | Hasil |
|
|
120
|
+
|---|---|
|
|
121
|
+
| `\$ping` | `$ping` (bukan dijalankan) |
|
|
122
|
+
| `\[` `\]` | `[` `]` |
|
|
123
|
+
| `\;` | `;` (tidak memisah argumen) |
|
|
124
|
+
| `\\` | `\` |
|
|
125
|
+
|
|
126
|
+
Atau pakai fungsi `$semicolon`, `$leftBracket`, `$rightBracket`, `$dollar`.
|
|
127
|
+
Tanda `$` yang diikuti angka atau spasi (misal `harga $5`) otomatis dianggap teks biasa.
|
|
128
|
+
|
|
129
|
+
> Di dalam template string JavaScript (tanda `` ` ``), backslash perlu **digandakan**: `` `\\$ping` ``. Jika tidak mau repot, pakai `$dollar`.
|
|
130
|
+
|
|
131
|
+
### Kode dicek sebelum bot menyala
|
|
132
|
+
|
|
133
|
+
Saat `bot.connect()` dipanggil, **semua kode diperiksa dulu**. Kalau ada fungsi salah ketik, jumlah argumen salah, atau `$if` tanpa `$endif`, bot **tidak login** dan kamu mendapat daftar lengkap masalahnya, contoh:
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
Ditemukan 2 masalah pada kode:
|
|
137
|
+
- command "ban": Fungsi $bann tidak dikenal (baris 3, kolom 1)
|
|
138
|
+
- command "cek": $if tidak ditutup, tambahkan $endif (baris 1, kolom 1)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## 5. Jenis handler
|
|
142
|
+
|
|
143
|
+
### Command prefix
|
|
144
|
+
|
|
145
|
+
```js
|
|
146
|
+
bot.command({ name: 'sapa', aliases: ['hai', 'halo'], code: 'Halo $username!' });
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Argumen setelah nama command: `$message` (semua), `$message[1]` (kata ke-1), `$argsCount`.
|
|
150
|
+
|
|
151
|
+
### Slash command
|
|
152
|
+
|
|
153
|
+
```js
|
|
154
|
+
bot.slashCommand({
|
|
155
|
+
name: 'halo', // huruf kecil, tanpa spasi
|
|
156
|
+
description: 'Menyapa seseorang',
|
|
157
|
+
options: [
|
|
158
|
+
{ name: 'nama', description: 'Nama', type: 'string', required: true },
|
|
159
|
+
{ name: 'umur', description: 'Umur', type: 'integer', minValue: 1 },
|
|
160
|
+
],
|
|
161
|
+
code: 'Halo, $option[nama]!',
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Tipe opsi: `string integer boolean user channel role mentionable number attachment`.
|
|
166
|
+
Slash command didaftarkan otomatis saat bot siap. Untuk uji coba cepat, isi `slashGuild: 'ID_SERVER'` (muncul seketika; kalau global bisa butuh waktu).
|
|
167
|
+
Jika proses lebih dari 3 detik, taruh `$defer` di awal kode.
|
|
168
|
+
|
|
169
|
+
### Tombol & select menu
|
|
170
|
+
|
|
171
|
+
```js
|
|
172
|
+
bot.command({
|
|
173
|
+
name: 'tombol',
|
|
174
|
+
code: '$addButton[Klik;primary;klik_1]$addButton[Web;link;https://example.com]Pilih:',
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
bot.button({ customId: 'klik_*', code: '$ephemeral Kamu menekan `$customID`' }); // * = wildcard
|
|
178
|
+
|
|
179
|
+
bot.command({
|
|
180
|
+
name: 'menu',
|
|
181
|
+
code: `Pilih buah:
|
|
182
|
+
$addSelectMenu[buah;Pilih...]
|
|
183
|
+
$addSelectOption[Apel;apel;Buah merah]
|
|
184
|
+
$addSelectOption[Jeruk;jeruk]`,
|
|
185
|
+
});
|
|
186
|
+
bot.select({ customId: 'buah', code: 'Kamu memilih: $interactionValues' });
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Gunakan `$update` agar tombol/select mengubah pesan aslinya (bukan mengirim pesan baru).
|
|
190
|
+
|
|
191
|
+
### Event
|
|
192
|
+
|
|
193
|
+
| Pendek | Dijalankan saat |
|
|
194
|
+
|---|---|
|
|
195
|
+
| `bot.onReady(code)` | bot siap |
|
|
196
|
+
| `bot.onMemberJoin(code)` | member masuk server |
|
|
197
|
+
| `bot.onMemberLeave(code)` | member keluar |
|
|
198
|
+
| `bot.onMessageDelete(code)` | pesan dihapus |
|
|
199
|
+
| `bot.onMessageUpdate(code)` | pesan diedit |
|
|
200
|
+
| `bot.onReactionAdd(code)` / `onReactionRemove` | reaksi ditambah / dihapus |
|
|
201
|
+
| `bot.onGuildJoin(code)` / `onGuildLeave` | bot masuk / keluar server |
|
|
202
|
+
| `bot.onMessage(code)` | setiap pesan yang **bukan** command |
|
|
203
|
+
| `bot.onMemberBan(code)` / `onMemberUnban` | user di-ban / ban dicabut (`$targetID`, `$targetName`) |
|
|
204
|
+
| `bot.onChannelCreate(code)` / `onChannelDelete` | channel dibuat / dihapus (`$targetName`) |
|
|
205
|
+
| `bot.onRoleCreate(code)` / `onRoleDelete` | role dibuat / dihapus (`$targetName`) |
|
|
206
|
+
| `bot.onThreadCreate(code)` | thread baru (jawaban dikirim ke thread itu) |
|
|
207
|
+
| `bot.onVoiceJoin(code)` / `onVoiceLeave` | member masuk / keluar voice (`$targetName` = nama voice). Pindah channel memicu keduanya |
|
|
208
|
+
|
|
209
|
+
Secara bawaan jawaban dikirim ke channel sistem server. Pilih channel lain dengan bentuk objek:
|
|
210
|
+
|
|
211
|
+
```js
|
|
212
|
+
bot.onMemberJoin({ channel: 'ID_CHANNEL', code: 'Selamat datang $mention! Kita sekarang $memberCount orang.' });
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## 6. Opsi Bot
|
|
216
|
+
|
|
217
|
+
```js
|
|
218
|
+
new Bot({
|
|
219
|
+
token: 'WAJIB',
|
|
220
|
+
prefix: '!', // atau ['!', '?']
|
|
221
|
+
mentionPrefix: true, // @bot command juga bisa
|
|
222
|
+
ignoreBots: true, // abaikan pesan dari bot lain
|
|
223
|
+
owners: ['ID_KAMU'], // untuk $onlyOwner dan $isOwner
|
|
224
|
+
timezone: 'Asia/Jakarta', // untuk $date
|
|
225
|
+
intents: 'default', // 'default' | 'all' | ['Guilds', ...]
|
|
226
|
+
status: { text: 'dengan kode', type: 'Playing', status: 'online' },
|
|
227
|
+
slashGuild: null, // ID server untuk slash cepat (null = global)
|
|
228
|
+
syncSlash: true, // daftarkan slash otomatis
|
|
229
|
+
database: { path: './easydc-data.json' }, // atau { memory: true }
|
|
230
|
+
messages: { cooldown: '⏳ Tunggu %time%.', error: '❌ Terjadi kesalahan.' },
|
|
231
|
+
debug: false, // true = tampilkan penyebab error di chat (hanya saat pengembangan!)
|
|
232
|
+
onError: (err, ctx) => {}, // tangani error sendiri
|
|
233
|
+
});
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Intent bawaan: `Guilds, GuildMessages, MessageContent, GuildMembers, GuildMessageReactions, DirectMessages, GuildModeration, GuildVoiceStates`.
|
|
237
|
+
|
|
238
|
+
Opsi tambahan: `eval: false` (nyalakan `$eval` / `$jsEval`, lihat [bagian 11](#11-eval-khusus-owner)).
|
|
239
|
+
|
|
240
|
+
## 7. Variabel & database
|
|
241
|
+
|
|
242
|
+
Variabel disimpan permanen di file JSON (`easydc-data.json`). Deklarasikan dulu dengan nilai awal:
|
|
243
|
+
|
|
244
|
+
```js
|
|
245
|
+
bot.variables({ uang: 0, bio: 'Belum diisi' });
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
| Fungsi | Cakupan |
|
|
249
|
+
|---|---|
|
|
250
|
+
| `$getUserVar[nama;userID?]` `$setUserVar[nama;nilai;userID?]` `$resetUserVar` | per user |
|
|
251
|
+
| `$getServerVar` `$setServerVar` `$resetServerVar` | per server |
|
|
252
|
+
| `$getChannelVar` `$setChannelVar` `$resetChannelVar` | per channel |
|
|
253
|
+
| `$getGlobalVar` `$setGlobalVar` `$resetGlobalVar` | satu untuk semua |
|
|
254
|
+
|
|
255
|
+
Semua nilai tersimpan sebagai **teks**. Gunakan `$math[...]` untuk berhitung.
|
|
256
|
+
Variabel sementara selama satu command: `$let[nama;nilai]` dan `$get[nama]`.
|
|
257
|
+
|
|
258
|
+
- Berkas database ditulis secara aman dan otomatis. Jika file rusak, ia **dicadangkan** (`*.corrupt-<waktu>`) dan bot mulai dari kosong, bukan crash.
|
|
259
|
+
- Untuk bot besar (ribuan user aktif) pertimbangkan database sungguhan; `Database` bawaan cocok untuk bot kecil sampai menengah.
|
|
260
|
+
- **Satu file database hanya boleh dipakai satu proses bot.**
|
|
261
|
+
|
|
262
|
+
## 8. Kondisi `$if`
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
$if[kondisi]
|
|
266
|
+
...
|
|
267
|
+
$elseif[kondisi]
|
|
268
|
+
...
|
|
269
|
+
$else
|
|
270
|
+
...
|
|
271
|
+
$endif
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Operator: `== != > < >= <=`, digabung dengan `&&` (dan) / `||` (atau). Tanpa tanda kurung.
|
|
275
|
+
Jika kedua sisi angka, dibandingkan sebagai angka (`10>9` benar); selain itu sebagai teks.
|
|
276
|
+
|
|
277
|
+
```
|
|
278
|
+
$if[$getUserVar[uang]>=100&&$isAdmin==true]
|
|
279
|
+
Kaya dan admin
|
|
280
|
+
$elseif[$getUserVar[uang]>=100]
|
|
281
|
+
Kaya
|
|
282
|
+
$else
|
|
283
|
+
Miskin
|
|
284
|
+
$endif
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**Aman dari injeksi:** nilai dinamis seperti `$message` tidak bisa dipakai pengguna untuk menyisipkan operator `&&`, `||`, dan sejenisnya ke dalam kondisi. Isi pesan pengguna selalu diperlakukan sebagai teks biasa.
|
|
288
|
+
|
|
289
|
+
Pembatas lain: `$onlyIf[kondisi;pesan?]`, `$stop[pesan?]`, `$onlyPerms`, `$onlyAdmin`, `$onlyOwner`, `$onlyForIDs`, `$onlyInServer`, `$argsCheck`, `$cooldown`.
|
|
290
|
+
|
|
291
|
+
## 9. Embed, tombol, select menu
|
|
292
|
+
|
|
293
|
+
```js
|
|
294
|
+
bot.command({
|
|
295
|
+
name: 'info',
|
|
296
|
+
code: `
|
|
297
|
+
$title[Info $serverName]
|
|
298
|
+
$description[Server ini punya $memberCount member.]
|
|
299
|
+
$color[#5865F2]
|
|
300
|
+
$thumbnail[$serverIcon]
|
|
301
|
+
$addField[Dibuat;$discordTime[$serverCreatedAt;D];true]
|
|
302
|
+
$addField[Ping;$ping ms;true]
|
|
303
|
+
$footer[Diminta oleh $username]
|
|
304
|
+
$addTimestamp
|
|
305
|
+
`,
|
|
306
|
+
});
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
- Embed pertama dibuat otomatis; `$newEmbed` memulai embed berikutnya (maksimal 10).
|
|
310
|
+
- Warna: `#RRGGBB`, nama (`red green blue yellow orange purple pink white black grey blurple`), atau `random`.
|
|
311
|
+
- Tombol: maksimal 5 per baris, 5 baris per pesan. Baris baru dibuat otomatis, atau paksa dengan `$newRow`.
|
|
312
|
+
- Panjang teks dicek sesuai batas Discord, dengan pesan error yang jelas jika terlampaui.
|
|
313
|
+
|
|
314
|
+
## 10. Fitur lanjutan
|
|
315
|
+
|
|
316
|
+
### Modal (form pop-up)
|
|
317
|
+
|
|
318
|
+
Modal harus menjadi respons **pertama** dari slash command, tombol, atau select menu (jangan pakai `$defer` sebelumnya; teks lain di command itu diabaikan).
|
|
319
|
+
|
|
320
|
+
```js
|
|
321
|
+
bot.slashCommand({
|
|
322
|
+
name: 'lapor',
|
|
323
|
+
description: 'Kirim laporan',
|
|
324
|
+
code: `
|
|
325
|
+
$addModal[lapor_form;Form Laporan]
|
|
326
|
+
$addTextInput[judul;Judul;short;Ringkas saja;true;3;50]
|
|
327
|
+
$addTextInput[isi;Isi laporan;paragraph]
|
|
328
|
+
`,
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
bot.modal({
|
|
332
|
+
customId: 'lapor_form', // boleh wildcard: 'lapor_*'
|
|
333
|
+
code: '$ephemeral Terima kasih! Judul: $modalValue[judul] | Isi: $modalValue[isi]',
|
|
334
|
+
});
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
Maksimal 5 kolom per modal. `$addTextInput[customID;label;gaya?;placeholder?;wajib?;min?;max?;nilaiAwal?]`, gaya `short` atau `paragraph`.
|
|
338
|
+
|
|
339
|
+
### Autocomplete (pilihan dinamis di slash command)
|
|
340
|
+
|
|
341
|
+
```js
|
|
342
|
+
bot.slashCommand({
|
|
343
|
+
name: 'buah',
|
|
344
|
+
description: 'Pilih buah',
|
|
345
|
+
options: [{ name: 'nama', description: 'Nama buah', autocomplete: true }], // tidak bisa bersama "choices"
|
|
346
|
+
code: 'Kamu memilih $option[nama]',
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
bot.autocomplete({
|
|
350
|
+
command: 'buah',
|
|
351
|
+
option: 'nama', // kosongkan untuk semua opsi autocomplete di command itu
|
|
352
|
+
code: `
|
|
353
|
+
$if[$checkContains[apel;$toLowerCase[$focusedValue]]==true]$addChoice[Apel;apel]$endif
|
|
354
|
+
$addChoice[Jeruk;jeruk]
|
|
355
|
+
$addChoice[Mangga;mangga]
|
|
356
|
+
`,
|
|
357
|
+
});
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
`$focusedValue` = teks yang sedang diketik. `$addChoice[nama;nilai?]` maksimal 25. Untuk opsi `integer`/`number`, nilai pilihan harus angka. Discord memberi waktu 3 detik, jadi jangan pakai `$wait`.
|
|
361
|
+
|
|
362
|
+
### Menu klik-kanan (context menu)
|
|
363
|
+
|
|
364
|
+
```js
|
|
365
|
+
bot.contextMenu({ name: 'Lihat Profil', menu: 'user', code: '$ephemeral Profil: $targetName (ID $targetID)' });
|
|
366
|
+
bot.contextMenu({ name: 'Laporkan', menu: 'message', code: '$ephemeral Pesan "$targetContent" dari $targetName dilaporkan.' });
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Muncul di menu *Apps* ketika pengguna klik kanan user atau pesan. Didaftarkan otomatis bersama slash command.
|
|
370
|
+
|
|
371
|
+
### Select menu user / role / channel
|
|
372
|
+
|
|
373
|
+
```
|
|
374
|
+
$addUserSelect[pilih_user;Pilih user;1;3]
|
|
375
|
+
$addRoleSelect[pilih_role]
|
|
376
|
+
$addMentionableSelect[pilih_apa_saja]
|
|
377
|
+
$addChannelSelect[pilih_channel;Pilih channel;;;text,voice]
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
Daftarkan handler dengan `bot.select({ customId: 'pilih_user', code: 'Dipilih: $interactionValues' })`. Nilainya berupa ID, dipisah koma.
|
|
381
|
+
|
|
382
|
+
### Lampiran, polling, webhook
|
|
383
|
+
|
|
384
|
+
```
|
|
385
|
+
$addAttachment[https://example.com/gambar.png;gambar.png]
|
|
386
|
+
$addTextFile[catatan.txt;isi file teks buatan sendiri]
|
|
387
|
+
$poll[Makan apa?;24;false;Nasi;Mie;Roti]
|
|
388
|
+
$sendWebhook[https://discord.com/api/webhooks/ID/TOKEN;Halo!;Nama Bot;https://example.com/avatar.png]
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
Lampiran hanya dari URL `http(s)` atau teks buatan sendiri (bot tidak membaca file dari disk). `$poll[pertanyaan;jam;multi;opsi...]` butuh 2-10 opsi.
|
|
392
|
+
|
|
393
|
+
### Thread, forum, dan manajemen server
|
|
394
|
+
|
|
395
|
+
```
|
|
396
|
+
$createThread[Diskusi;$messageID;1440] -> mengembalikan ID thread
|
|
397
|
+
$createForumPost[ID_FORUM;Judul;Isi]
|
|
398
|
+
$unban[ID;alasan] $isBanned[ID] $banCount
|
|
399
|
+
$createChannel[info;text;ID_KATEGORI;Topik] $lockChannel $unlockChannel
|
|
400
|
+
$createRole[VIP;#ff0000;true] $createInvite[;3600;10]
|
|
401
|
+
$createEvent[Nobar;MULAI_MS;SELESAI_MS;Voice 1;Deskripsi]
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
Fungsi manajemen memakai **izin bot**, jadi lindungi dengan `$onlyPerms[...]` seperti di bagian [Keamanan](#14-keamanan). Daftar lengkapnya ada di bagian [Daftar semua fungsi](#16-daftar-semua-fungsi).
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## 11. Eval (khusus owner)
|
|
409
|
+
|
|
410
|
+
Eval menjalankan kode yang diketik saat bot berjalan, berguna untuk debugging. Ada dua jenis:
|
|
411
|
+
|
|
412
|
+
| Fungsi | Bahasa kode yang dijalankan |
|
|
413
|
+
|---|---|
|
|
414
|
+
| `$eval[kode]` | kode versi port, yaitu sintaks `$fungsi` package ini |
|
|
415
|
+
| `$jsEval[kode]` | JavaScript / **discord.js asli** |
|
|
416
|
+
|
|
417
|
+
Di `$jsEval` tersedia variabel: `ctx` `client` `bot` `guild` `channel` `message` `user` `member` `interaction` `discord` (modul discord.js) `db` `require`. Ekspresi tunggal langsung dikembalikan hasilnya; untuk beberapa pernyataan, tulis `return`. Boleh memakai `await`.
|
|
418
|
+
|
|
419
|
+
### Cara pakai paling mudah
|
|
420
|
+
|
|
421
|
+
```js
|
|
422
|
+
const bot = new Bot({
|
|
423
|
+
token: process.env.TOKEN,
|
|
424
|
+
owners: ['ID_DISCORD_KAMU'],
|
|
425
|
+
eval: true, // eval MATI kecuali dinyalakan di sini
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
bot.evalCommand(); // memasang command "eval" (nama bisa diganti: { name: 'e', aliases: ['ev'] })
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
Lalu di Discord:
|
|
432
|
+
|
|
433
|
+
```
|
|
434
|
+
!eval $math[6*7] -> kode versi port
|
|
435
|
+
!eval Halo $username dari $serverName
|
|
436
|
+
!eval js client.guilds.cache.size -> discord.js asli
|
|
437
|
+
!eval js guild.members.cache.filter(m => m.user.bot).size
|
|
438
|
+
!eval js const g = await client.guilds.fetch(guild.id);
|
|
439
|
+
return g.memberCount;
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
Hasil dikirim dalam blok kode (maksimal ±1800 karakter), error ditampilkan sebagai `❌ ...`, dan **token otomatis disensor** dari hasil.
|
|
443
|
+
|
|
444
|
+
Bisa juga dipakai di command buatan sendiri: `$eval[$message]` dan `$jsEval[$message]`. Gunakan `$messageFrom[2]` untuk mengambil semua teks mulai kata ke-2 (spasi dan baris baru terjaga).
|
|
445
|
+
|
|
446
|
+
### ⚠️ Peringatan keamanan
|
|
447
|
+
|
|
448
|
+
- **`$jsEval` memberi akses PENUH** ke bot dan mesin tempat bot berjalan: membaca file, variabel lingkungan, mengirim data keluar, bahkan mematikan proses. Eval hanya berjalan bila `eval: true` **dan** pengirim ada di `owners`; selain itu langsung ditolak.
|
|
449
|
+
- Isi `owners` hanya dengan ID **Anda sendiri**. Jangan beri akses kepada orang lain, termasuk "admin kepercayaan".
|
|
450
|
+
- Jika akun Discord owner dibajak, penyerang bisa mengambil alih server hosting. Aktifkan 2FA.
|
|
451
|
+
- Matikan `eval` (hapus `eval: true`) di bot produksi yang tidak membutuhkannya.
|
|
452
|
+
- Sensor token hanya pencegah kecelakaan, bukan pengaman: kode JS tetap bisa membaca token dan mengirimnya ke tempat lain.
|
|
453
|
+
- `$eval` bersarang dibatasi 3 tingkat. Perulangan tak berujung (`while(true){}`) di `$jsEval` tidak bisa dihentikan, dan akan membekukan bot sampai di-restart.
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
## 12. Membuat fungsi sendiri
|
|
458
|
+
|
|
459
|
+
```js
|
|
460
|
+
bot.addFunction({
|
|
461
|
+
name: '$salam',
|
|
462
|
+
params: 1, // jumlah argumen tepat (atau pakai min/max)
|
|
463
|
+
description: 'Menyapa seseorang',
|
|
464
|
+
run: (ctx, [nama]) => `Selamat datang, ${nama}! (diminta oleh ${ctx.user.username})`,
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
bot.command({ name: 'tes', code: '$salam[Budi]' });
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
`run` boleh `async`. `ctx` berisi `bot`, `client`, `guild`, `channel`, `member`, `user`, `message`, `interaction`, `args`. Lempar `new Error('pesan')` bila gagal; pesan itu akan dicatat di log.
|
|
471
|
+
Opsi `override: true` mengganti fungsi bawaan.
|
|
472
|
+
|
|
473
|
+
## 13. Memisah command ke banyak file
|
|
474
|
+
|
|
475
|
+
```
|
|
476
|
+
proyek/
|
|
477
|
+
├── index.js
|
|
478
|
+
└── commands/
|
|
479
|
+
├── umum.js
|
|
480
|
+
└── moderasi.js
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
```js
|
|
484
|
+
bot.loadCommands('./commands');
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
Setiap file mengekspor satu objek atau array. Tambahkan `type` untuk selain command biasa (`'slash'`, `'button'`, `'select'`, `'modal'`, `'autocomplete'`, `'contextMenu'`, atau nama event seperti `'memberJoin'`). Contoh lengkap: [`examples/advanced/lanjutan.js`](examples/advanced/lanjutan.js).
|
|
488
|
+
|
|
489
|
+
```js
|
|
490
|
+
module.exports = [
|
|
491
|
+
{ name: 'halo', code: 'Halo $username' },
|
|
492
|
+
{ type: 'slash', name: 'ping', description: 'Cek ping', code: '$ping ms' },
|
|
493
|
+
{ type: 'button', customId: 'ok_*', code: 'Oke!' },
|
|
494
|
+
{ type: 'memberJoin', code: 'Selamat datang $mention' },
|
|
495
|
+
];
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
## 14. Keamanan
|
|
499
|
+
|
|
500
|
+
- **Jangan taruh token di kode** atau di GitHub. Pakai variabel lingkungan. Jika token bocor, segera *Reset Token* di Developer Portal.
|
|
501
|
+
- Fungsi aksi dan manajemen (`$ban`, `$unban`, `$kick`, `$timeout`, `$addRole`, `$clear`, `$sendDM`, `$createChannel`, `$deleteChannel`, `$deleteRole`, `$lockChannel`, `$leaveServer`, ...) memakai **izin bot**, bukan izin pengirim. **Selalu** lindungi dengan `$onlyPerms[...]`, `$onlyAdmin`, atau `$onlyOwner` di baris pertama command.
|
|
502
|
+
- Mention yang dikirim bot dibatasi ke user saja (`@everyone` dan role tidak akan menyebut siapa pun). Ubah lewat opsi `allowedMentions` bila perlu.
|
|
503
|
+
- Kalkulator `$math` tidak memakai `eval`, jadi aman dari eksekusi kode.
|
|
504
|
+
- Biarkan `debug: false` di produksi supaya detail error tidak tampil ke pengguna (tetap tercatat di konsol).
|
|
505
|
+
|
|
506
|
+
## 15. Pemecahan masalah
|
|
507
|
+
|
|
508
|
+
| Masalah | Penyebab / solusi |
|
|
509
|
+
|---|---|
|
|
510
|
+
| Bot online tapi tidak merespons `!ping` | Aktifkan **Message Content Intent** di Developer Portal. |
|
|
511
|
+
| `Used disallowed intents` saat login | Aktifkan intent yang diminta di Developer Portal (Server Members / Message Content), atau kurangi `intents`. |
|
|
512
|
+
| Event member masuk/keluar tidak jalan | Aktifkan **Server Members Intent**. |
|
|
513
|
+
| Slash command tidak muncul | Undang bot dengan scope `applications.commands`. Pakai `slashGuild` agar langsung muncul; global bisa butuh waktu. |
|
|
514
|
+
| `Fungsi $xxx tidak dikenal` | Salah ketik. Jika maksudnya teks biasa, tulis `\$xxx` (atau `$dollar`). |
|
|
515
|
+
| `... membutuhkan N argumen` | Jumlah `;` tidak sesuai. Tulis `\;` bila `;` bagian dari teks. |
|
|
516
|
+
| Variabel "belum dideklarasikan" | Tambahkan di `bot.variables({ ... })` sebelum `bot.connect()`. |
|
|
517
|
+
| Tombol/select tidak merespons | Pastikan `customId` di tombol sama dengan di `bot.button({ customId })`. |
|
|
518
|
+
| `Missing Permissions` di log | Bot kurang izin / posisi role bot di bawah role target. |
|
|
519
|
+
| `Token belum diisi` | `process.env.TOKEN` kosong. Cek cara menjalankan di bagian 2. |
|
|
520
|
+
| Interaksi gagal ("This interaction failed") | Proses > 3 detik. Taruh `$defer` di awal. |
|
|
521
|
+
| Modal tidak muncul / "Modal harus jadi respons pertama" | Jangan pakai `$defer` atau kirim pesan sebelum `$addModal`. Modal hanya dari slash/tombol/select, bukan command prefix. |
|
|
522
|
+
| Autocomplete kosong | Opsi harus dibuat dengan `autocomplete: true`, dan handler `bot.autocomplete({ command, option })` cocok. Proses harus selesai < 3 detik. |
|
|
523
|
+
| `$eval ... dimatikan` | Tambahkan `eval: true` dan `owners: ['ID_KAMU']` pada `new Bot({...})`. |
|
|
524
|
+
| Event ban / voice tidak jalan | Intent `GuildModeration` / `GuildVoiceStates` sudah aktif secara bawaan; jika kamu mengatur `intents` sendiri, tambahkan keduanya. |
|
|
525
|
+
|
|
526
|
+
---
|
|
527
|
+
|
|
528
|
+
## 16. Daftar semua fungsi
|
|
529
|
+
|
|
530
|
+
Tanda `?` berarti argumen opsional. Daftar ini dibuat otomatis dari kode (`npm run docs`).
|
|
531
|
+
|
|
532
|
+
<!-- FUNCTIONS:START -->
|
|
533
|
+
|
|
534
|
+
### Info (user, server, bot, pesan, waktu)
|
|
535
|
+
|
|
536
|
+
| Fungsi | Keterangan |
|
|
537
|
+
|---|---|
|
|
538
|
+
| `$username[userID?]` | Username (tanpa ID = pengirim) |
|
|
539
|
+
| `$usertag[userID?]` | Tag user |
|
|
540
|
+
| `$displayName[userID?]` | Nama tampilan (nickname server / nama global / username) |
|
|
541
|
+
| `$nickname[userID?]` | Nickname di server (kosong -> username) |
|
|
542
|
+
| `$authorID` | ID pengirim pesan / pengguna interaksi |
|
|
543
|
+
| `$userAvatar[userID?;ukuran?]` | URL avatar (ukuran 16-4096) |
|
|
544
|
+
| `$isBot[userID?]` | true/false: apakah user adalah bot |
|
|
545
|
+
| `$userCreatedAt[userID?]` | Waktu akun dibuat (ms) |
|
|
546
|
+
| `$mentioned[nomor;fallbackAuthor?]` | ID user yang di-mention ke-N (isi 2: yes = pakai pengirim bila tidak ada) |
|
|
547
|
+
| `$mention[userID?]` | Mention user, contoh <@123> |
|
|
548
|
+
| `$serverName` | Nama server |
|
|
549
|
+
| `$serverID` | ID server |
|
|
550
|
+
| `$serverIcon` | URL ikon server |
|
|
551
|
+
| `$memberCount` | Jumlah member server |
|
|
552
|
+
| `$ownerID` | ID pemilik server |
|
|
553
|
+
| `$serverCreatedAt` | Waktu server dibuat (ms) |
|
|
554
|
+
| `$roleCount` | Jumlah role |
|
|
555
|
+
| `$channelCount` | Jumlah channel |
|
|
556
|
+
| `$channelName[channelID?]` | Nama channel (tanpa ID = channel ini) |
|
|
557
|
+
| `$channelID` | ID channel saat ini |
|
|
558
|
+
| `$channelMention[channelID?]` | Mention channel, contoh <#123> |
|
|
559
|
+
| `$roleName[roleID]` | Nama role |
|
|
560
|
+
| `$roleMention[roleID]` | Mention role, contoh <@&123> |
|
|
561
|
+
| `$botID` | ID bot |
|
|
562
|
+
| `$botName` | Username bot |
|
|
563
|
+
| `$ping` | Ping websocket (ms) |
|
|
564
|
+
| `$uptime` | Lama bot menyala, contoh "1d 2h 3m 4s" |
|
|
565
|
+
| `$serverCount` | Jumlah server tempat bot berada |
|
|
566
|
+
| `$message[nomor?]` | Semua argumen setelah command, atau argumen ke-N |
|
|
567
|
+
| `$argsCount` | Jumlah argumen |
|
|
568
|
+
| `$messageID` | ID pesan / interaksi |
|
|
569
|
+
| `$messageContent` | Isi lengkap pesan pemicu |
|
|
570
|
+
| `$commandName` | Nama command yang berjalan |
|
|
571
|
+
| `$option[nama]` | Nilai opsi slash command |
|
|
572
|
+
| `$customID` | customId tombol/select yang ditekan |
|
|
573
|
+
| `$interactionValues[nomor?]` | Nilai yang dipilih di select menu |
|
|
574
|
+
| `$reactionEmoji` | Emoji pada event reaksi |
|
|
575
|
+
| `$timestamp` | Waktu sekarang (ms) |
|
|
576
|
+
| `$unix` | Waktu sekarang (detik) |
|
|
577
|
+
| `$date[format?;ms?]` | Tanggal/jam. Token: YYYY MM DD HH mm ss. Zona waktu dari opsi timezone |
|
|
578
|
+
| `$discordTime[ms?;gaya?]` | Format waktu Discord <t:..>. Gaya: t T d D f F R |
|
|
579
|
+
|
|
580
|
+
### Teks, matematika & pengecekan
|
|
581
|
+
|
|
582
|
+
| Fungsi | Keterangan |
|
|
583
|
+
|---|---|
|
|
584
|
+
| `$math[ekspresi]` | Hitung aman. Dukung + - * / % ^ ( ) sqrt abs round floor ceil min max pow pi e |
|
|
585
|
+
| `$sum[a;b;...]` | Jumlah semua angka |
|
|
586
|
+
| `$sub[a;b]` | a - b |
|
|
587
|
+
| `$multiply[a;b;...]` | Kali semua angka |
|
|
588
|
+
| `$divide[a;b]` | a / b |
|
|
589
|
+
| `$modulo[a;b]` | Sisa bagi a % b |
|
|
590
|
+
| `$round[angka;desimal?]` | Bulatkan angka |
|
|
591
|
+
| `$max[a;b;...]` | Angka terbesar |
|
|
592
|
+
| `$min[a;b;...]` | Angka terkecil |
|
|
593
|
+
| `$random[min;max]` | Bilangan bulat acak (inklusif) |
|
|
594
|
+
| `$randomText[a;b;...]` | Pilih salah satu teks secara acak |
|
|
595
|
+
| `$numberSeparator[angka;pemisah?]` | 1234567 -> 1,234,567 |
|
|
596
|
+
| `$toUpperCase[teks]` | HURUF BESAR |
|
|
597
|
+
| `$toLowerCase[teks]` | huruf kecil |
|
|
598
|
+
| `$capitalize[teks]` | Huruf pertama jadi besar |
|
|
599
|
+
| `$titleCase[teks]` | Huruf Pertama Tiap Kata Besar |
|
|
600
|
+
| `$trimSpace[teks]` | Hapus spasi di awal/akhir |
|
|
601
|
+
| `$length[teks]` | Jumlah karakter |
|
|
602
|
+
| `$reverse[teks]` | Balik urutan teks |
|
|
603
|
+
| `$repeat[teks;jumlah]` | Ulang teks (maks 100x) |
|
|
604
|
+
| `$substring[teks;awal;akhir?]` | Potong teks (indeks mulai 0) |
|
|
605
|
+
| `$replaceText[teks;cari;ganti;batas?]` | Ganti teks (semua, atau N pertama) |
|
|
606
|
+
| `$split[teks;pemisah;nomor]` | Ambil bagian ke-N setelah memecah teks |
|
|
607
|
+
| `$urlEncode[teks]` | Encode untuk URL |
|
|
608
|
+
| `$semicolon` | Karakter ; |
|
|
609
|
+
| `$leftBracket` | Karakter [ |
|
|
610
|
+
| `$rightBracket` | Karakter ] |
|
|
611
|
+
| `$dollar` | Karakter $ |
|
|
612
|
+
| `$isNumber[teks]` | true/false: apakah angka |
|
|
613
|
+
| `$checkContains[teks;cari1;cari2;...]` | true bila teks memuat salah satu kata |
|
|
614
|
+
| `$checkCondition[kondisi]` | true/false. Operator: == != > < >= <= && \|\| |
|
|
615
|
+
| `$hasRole[roleID;userID?]` | true/false: member punya role |
|
|
616
|
+
| `$hasPerms[izin1,izin2;userID?]` | true/false: member punya semua izin (nama izin discord.js) |
|
|
617
|
+
| `$isAdmin[userID?]` | true/false: member administrator |
|
|
618
|
+
| `$isOwner[userID?]` | true/false: user ada di daftar owners bot |
|
|
619
|
+
| `$isTrue[teks]` | true bila teks bernilai true/yes/1/on |
|
|
620
|
+
|
|
621
|
+
### Kontrol alur & batasan
|
|
622
|
+
|
|
623
|
+
| Fungsi | Keterangan |
|
|
624
|
+
|---|---|
|
|
625
|
+
| `$if[kondisi]` | Mulai blok kondisi. Tutup dengan $endif |
|
|
626
|
+
| `$elseif[kondisi]` | Kondisi alternatif |
|
|
627
|
+
| `$else` | Jika semua kondisi sebelumnya salah |
|
|
628
|
+
| `$endif` | Menutup blok $if |
|
|
629
|
+
| `$stop[pesan?]` | Hentikan eksekusi (opsional kirim pesan) |
|
|
630
|
+
| `$onlyIf[kondisi;pesan?]` | Lanjut hanya jika kondisi benar |
|
|
631
|
+
| `$onlyPerms[Izin1,Izin2;pesan?]` | Lanjut hanya jika pengirim punya semua izin (mis. BanMembers) |
|
|
632
|
+
| `$onlyBotPerms[Izin1,Izin2;pesan?]` | Lanjut hanya jika bot punya izin tersebut di server |
|
|
633
|
+
| `$onlyAdmin[pesan?]` | Lanjut hanya jika pengirim administrator |
|
|
634
|
+
| `$onlyOwner[pesan?]` | Lanjut hanya jika pengirim ada di opsi owners |
|
|
635
|
+
| `$onlyForIDs[id1,id2;pesan?]` | Lanjut hanya untuk user dengan ID tertentu |
|
|
636
|
+
| `$onlyInServer[pesan?]` | Lanjut hanya jika dipakai di server (bukan DM) |
|
|
637
|
+
| `$argsCheck[syarat;pesan?]` | Cek jumlah argumen. "2" = minimal 2; juga >=1 <=3 >1 <3 =2 |
|
|
638
|
+
| `$cooldown[waktu;pesan?]` | Cooldown per user per command. %time% di pesan = sisa waktu |
|
|
639
|
+
| `$wait[waktu]` | Tunggu sebentar (maks 60 detik) |
|
|
640
|
+
| `$deleteCommand` | Hapus pesan perintah milik pengirim setelah dijawab |
|
|
641
|
+
| `$deleteIn[waktu]` | Hapus jawaban bot setelah waktu tertentu (maks 24 jam) |
|
|
642
|
+
| `$ephemeral` | Slash/tombol: jawaban hanya terlihat oleh pengguna |
|
|
643
|
+
| `$reply` | Jawab dengan fitur reply pada pesan perintah |
|
|
644
|
+
| `$update` | Tombol/select: ubah pesan asal, bukan kirim pesan baru |
|
|
645
|
+
| `$typing` | Tampilkan "sedang mengetik" |
|
|
646
|
+
| `$defer` | Slash/tombol: tunda jawaban (untuk proses > 3 detik). Taruh $ephemeral sebelum ini bila perlu |
|
|
647
|
+
| `$let[nama;nilai]` | Simpan variabel sementara (hanya selama command berjalan) |
|
|
648
|
+
| `$get[nama]` | Ambil variabel sementara dari $let |
|
|
649
|
+
|
|
650
|
+
### Variabel & database
|
|
651
|
+
|
|
652
|
+
| Fungsi | Keterangan |
|
|
653
|
+
|---|---|
|
|
654
|
+
| `$setUserVar[nama;nilai;userID?]` | Simpan variabel user (harus dideklarasikan dengan bot.variables) |
|
|
655
|
+
| `$getUserVar[nama;userID?]` | Baca variabel user |
|
|
656
|
+
| `$resetUserVar[nama;userID?]` | Kembalikan variabel user ke nilai awal |
|
|
657
|
+
| `$setServerVar[nama;nilai;serverID?]` | Simpan variabel server (harus dideklarasikan dengan bot.variables) |
|
|
658
|
+
| `$getServerVar[nama;serverID?]` | Baca variabel server |
|
|
659
|
+
| `$resetServerVar[nama;serverID?]` | Kembalikan variabel server ke nilai awal |
|
|
660
|
+
| `$setChannelVar[nama;nilai;channelID?]` | Simpan variabel channel (harus dideklarasikan dengan bot.variables) |
|
|
661
|
+
| `$getChannelVar[nama;channelID?]` | Baca variabel channel |
|
|
662
|
+
| `$resetChannelVar[nama;channelID?]` | Kembalikan variabel channel ke nilai awal |
|
|
663
|
+
| `$setGlobalVar[nama;nilai]` | Simpan variabel global |
|
|
664
|
+
| `$getGlobalVar[nama]` | Baca variabel global |
|
|
665
|
+
| `$resetGlobalVar[nama]` | Kembalikan variabel global ke nilai awal |
|
|
666
|
+
|
|
667
|
+
### Embed
|
|
668
|
+
|
|
669
|
+
| Fungsi | Keterangan |
|
|
670
|
+
|---|---|
|
|
671
|
+
| `$newEmbed` | Mulai embed baru (embed pertama dibuat otomatis). Maks 10 |
|
|
672
|
+
| `$title[teks]` | Judul embed (maks 256) |
|
|
673
|
+
| `$embedURL[url]` | Tautan pada judul embed |
|
|
674
|
+
| `$description[teks]` | Isi embed (maks 4096) |
|
|
675
|
+
| `$color[#hex|nama|random]` | Warna embed |
|
|
676
|
+
| `$footer[teks;ikonURL?]` | Footer embed (maks 2048) |
|
|
677
|
+
| `$author[nama;ikonURL?;url?]` | Penulis embed (maks 256) |
|
|
678
|
+
| `$thumbnail[url]` | Gambar kecil embed |
|
|
679
|
+
| `$image[url]` | Gambar besar embed |
|
|
680
|
+
| `$addField[nama;isi;inline?]` | Tambah field (maks 25; inline = true/false) |
|
|
681
|
+
| `$addTimestamp[ms?]` | Tambah cap waktu di embed (default: sekarang) |
|
|
682
|
+
|
|
683
|
+
### Tombol & select menu
|
|
684
|
+
|
|
685
|
+
| Fungsi | Keterangan |
|
|
686
|
+
|---|---|
|
|
687
|
+
| `$addUserSelect[customID;placeholder?;min?;max?]` | Select menu pilih user (nilai terpilih lewat $interactionValues) |
|
|
688
|
+
| `$addRoleSelect[customID;placeholder?;min?;max?]` | Select menu pilih role (nilai terpilih lewat $interactionValues) |
|
|
689
|
+
| `$addMentionableSelect[customID;placeholder?;min?;max?]` | Select menu pilih user atau role (nilai terpilih lewat $interactionValues) |
|
|
690
|
+
| `$addChannelSelect[customID;placeholder?;min?;max?;tipe?]` | Select menu pilih channel (nilai terpilih lewat $interactionValues). Tipe: text voice category announcement stage forum, pisah koma |
|
|
691
|
+
| `$newRow` | Mulai baris tombol baru (otomatis tiap 5 tombol) |
|
|
692
|
+
| `$addButton[label;gaya;customID/URL;nonaktif?;emoji?]` | Tambah tombol. Gaya: primary secondary success danger link |
|
|
693
|
+
| `$addSelectMenu[customID;placeholder?;min?;max?]` | Buat select menu (lanjutkan dengan $addSelectOption) |
|
|
694
|
+
| `$addSelectOption[label;nilai;deskripsi?;emoji?;default?]` | Tambah opsi ke select menu terakhir (maks 25) |
|
|
695
|
+
|
|
696
|
+
### Aksi & moderasi
|
|
697
|
+
|
|
698
|
+
| Fungsi | Keterangan |
|
|
699
|
+
|---|---|
|
|
700
|
+
| `$sendMessage[channelID;teks]` | Kirim pesan ke channel lain |
|
|
701
|
+
| `$sendDM[userID;teks]` | Kirim DM ke user |
|
|
702
|
+
| `$react[emoji1;emoji2;...]` | Beri reaksi pada pesan perintah |
|
|
703
|
+
| `$ban[userID;alasan?;hariHapusPesan?]` | Ban user (hapus pesan 0-7 hari) |
|
|
704
|
+
| `$kick[userID;alasan?]` | Kick member |
|
|
705
|
+
| `$timeout[userID;waktu;alasan?]` | Timeout member (maks 28 hari) |
|
|
706
|
+
| `$untimeout[userID;alasan?]` | Cabut timeout member |
|
|
707
|
+
| `$addRole[userID;roleID;alasan?]` | Beri role |
|
|
708
|
+
| `$removeRole[userID;roleID;alasan?]` | Cabut role |
|
|
709
|
+
| `$setNickname[userID;nickname]` | Ubah nickname (kosongkan untuk reset) |
|
|
710
|
+
| `$clear[jumlah]` | Hapus 1-100 pesan terakhir (maks umur 14 hari). Mengembalikan jumlah terhapus |
|
|
711
|
+
| `$slowmode[detik]` | Atur slowmode channel (0 = mati, maks 21600) |
|
|
712
|
+
|
|
713
|
+
### Pesan, lampiran, polling, thread & webhook
|
|
714
|
+
|
|
715
|
+
| Fungsi | Keterangan |
|
|
716
|
+
|---|---|
|
|
717
|
+
| `$editMessage[messageID;teks;channelID?]` | Edit pesan milik bot sendiri |
|
|
718
|
+
| `$deleteMessage[messageID;channelID?]` | Hapus satu pesan |
|
|
719
|
+
| `$pinMessage[messageID;channelID?]` | Sematkan (pin) pesan |
|
|
720
|
+
| `$unpinMessage[messageID;channelID?]` | Lepas pin pesan |
|
|
721
|
+
| `$addReaction[messageID;emoji;channelID?]` | Beri reaksi pada pesan tertentu |
|
|
722
|
+
| `$messageContentOf[messageID;channelID?]` | Isi teks pesan tertentu |
|
|
723
|
+
| `$messageAuthorOf[messageID;channelID?]` | ID pengirim pesan tertentu |
|
|
724
|
+
| `$addAttachment[url;nama?]` | Lampirkan file dari URL http(s) ke jawaban (maks 10) |
|
|
725
|
+
| `$addTextFile[namaFile;isi]` | Lampirkan file teks buatan sendiri (maks 1 MB) |
|
|
726
|
+
| `$poll[pertanyaan;jam;multi;opsi1;opsi2;...]` | Buat polling (jam 1-768, multi = true/false, 2-10 opsi) |
|
|
727
|
+
| `$sendWebhook[webhookURL;teks;username?;avatarURL?]` | Kirim pesan lewat URL webhook Discord |
|
|
728
|
+
| `$createThread[nama;messageID?;arsipOtomatisMenit?]` | Buat thread (dari pesan bila messageID diisi). Arsip: 60/1440/4320/10080. Mengembalikan ID thread |
|
|
729
|
+
| `$archiveThread[threadID?;kunci?]` | Arsipkan thread (kunci = true untuk sekalian dikunci) |
|
|
730
|
+
| `$addThreadMember[userID;threadID?]` | Tambahkan user ke thread |
|
|
731
|
+
| `$removeThreadMember[userID;threadID?]` | Keluarkan user dari thread |
|
|
732
|
+
| `$createForumPost[forumID;judul;isi]` | Buat postingan di channel forum. Mengembalikan ID thread |
|
|
733
|
+
|
|
734
|
+
### Manajemen server (ban, channel, role, undangan, emoji, event, voice)
|
|
735
|
+
|
|
736
|
+
| Fungsi | Keterangan |
|
|
737
|
+
|---|---|
|
|
738
|
+
| `$unban[userID;alasan?]` | Cabut ban user |
|
|
739
|
+
| `$isBanned[userID]` | true/false: user sedang di-ban di server ini |
|
|
740
|
+
| `$banCount` | Jumlah user ter-ban (dibaca maks 1000 teratas) |
|
|
741
|
+
| `$createChannel[nama;tipe?;parentID?;topik?]` | Buat channel. Tipe: text voice category announcement stage forum. Mengembalikan ID |
|
|
742
|
+
| `$deleteChannel[channelID;alasan?]` | Hapus channel/thread (menghapus channel saat ini membuat jawaban gagal terkirim) |
|
|
743
|
+
| `$setChannelName[channelID;nama;alasan?]` | Ubah nama channel |
|
|
744
|
+
| `$setChannelTopic[channelID;topik;alasan?]` | Ubah topik channel |
|
|
745
|
+
| `$lockChannel[channelID?;alasan?]` | Kunci channel: @everyone tidak bisa mengirim pesan |
|
|
746
|
+
| `$unlockChannel[channelID?;alasan?]` | Buka kunci channel (kembali ke pengaturan semula) |
|
|
747
|
+
| `$createInvite[channelID?;umurDetik?;maxPakai?]` | Buat link undangan. Umur 0-604800 (0 = selamanya), maxPakai 0-100. Mengembalikan URL |
|
|
748
|
+
| `$channelType[channelID?]` | Tipe channel: text voice category announcement stage forum dst. |
|
|
749
|
+
| `$createRole[nama;warna?;hoist?;mentionable?;alasan?]` | Buat role. Mengembalikan ID |
|
|
750
|
+
| `$deleteRole[roleID;alasan?]` | Hapus role |
|
|
751
|
+
| `$setRoleName[roleID;nama;alasan?]` | Ubah nama role |
|
|
752
|
+
| `$setRoleColor[roleID;warna;alasan?]` | Ubah warna role (#hex / nama / random) |
|
|
753
|
+
| `$memberRoles[userID?]` | Daftar ID role member, dipisah koma |
|
|
754
|
+
| `$createEmoji[nama;url]` | Tambah emoji dari URL gambar. Mengembalikan emoji siap pakai |
|
|
755
|
+
| `$deleteEmoji[emojiID]` | Hapus emoji server |
|
|
756
|
+
| `$createEvent[nama;mulaiMs;selesaiMs;lokasi;deskripsi?]` | Buat scheduled event (di luar Discord). Waktu dalam ms (lihat $timestamp). Mengembalikan ID |
|
|
757
|
+
| `$moveMember[userID;voiceChannelID]` | Pindahkan member ke voice channel lain |
|
|
758
|
+
| `$disconnectMember[userID]` | Keluarkan member dari voice channel |
|
|
759
|
+
| `$leaveServer[serverID?]` | Bot keluar dari server. Hanya untuk owner bot |
|
|
760
|
+
|
|
761
|
+
### Modal, autocomplete & sasaran
|
|
762
|
+
|
|
763
|
+
| Fungsi | Keterangan |
|
|
764
|
+
|---|---|
|
|
765
|
+
| `$addModal[customID;judul]` | Tampilkan form pop-up (modal). Jadi respons pertama; teks lain diabaikan. Isi dengan $addTextInput |
|
|
766
|
+
| `$addTextInput[customID;label;gaya?;placeholder?;wajib?;min?;max?;nilaiAwal?]` | Tambah kolom isian ke modal (maks 5). Gaya: short / paragraph |
|
|
767
|
+
| `$modalValue[customIDKolom]` | Isi kolom modal yang dikirim pengguna (dipakai di handler bot.modal) |
|
|
768
|
+
| `$focusedValue` | Autocomplete: teks yang sedang diketik pengguna |
|
|
769
|
+
| `$focusedOption` | Autocomplete: nama opsi yang sedang diisi |
|
|
770
|
+
| `$addChoice[nama;nilai?]` | Autocomplete: tambah satu pilihan (maks 25). Nilai bawaan = nama |
|
|
771
|
+
| `$targetID` | ID sasaran: user/pesan yang diklik kanan, atau objek event (channel/role/thread/voice/ban) |
|
|
772
|
+
| `$targetName` | Nama sasaran (username / nama channel / nama role) |
|
|
773
|
+
| `$targetContent` | Isi pesan yang diklik kanan (context menu pesan) |
|
|
774
|
+
| `$messageFrom[nomor]` | Seluruh teks argumen mulai dari kata ke-N (spasi dan baris baru dipertahankan) |
|
|
775
|
+
|
|
776
|
+
### Eval (khusus owner)
|
|
777
|
+
|
|
778
|
+
| Fungsi | Keterangan |
|
|
779
|
+
|---|---|
|
|
780
|
+
| `$eval[kode]` | Jalankan kode versi port ($fungsi) dari teks saat berjalan. Khusus owner, butuh opsi eval: true |
|
|
781
|
+
| `$jsEval[kodeJavaScript]` | Jalankan kode discord.js/JavaScript asli. Variabel: ctx client bot guild channel message user member interaction discord db require. Khusus owner, butuh opsi eval: true |
|
|
782
|
+
|
|
783
|
+
<!-- FUNCTIONS:END -->
|
|
784
|
+
|
|
785
|
+
---
|
|
786
|
+
|
|
787
|
+
## Yang belum didukung
|
|
788
|
+
|
|
789
|
+
Package ini belum mencakup seluruh discord.js. Belum ada: **voice/musik** (memutar audio), **sharding**, **AutoMod rules**, **stiker**, pengaturan permission per-channel yang rinci, dan Components V2. Untuk itu pakai `bot.client` (client discord.js asli) atau tambahkan fungsi lewat `bot.addFunction`.
|
|
790
|
+
|
|
791
|
+
## Riwayat versi
|
|
792
|
+
|
|
793
|
+
- **1.1.0**: `$unban` dan manajemen server (channel, role, undangan, emoji, event, voice), edit/hapus/pin pesan, lampiran, poll, webhook, thread & forum, modal, autocomplete, context menu, select user/role/channel, 9 event baru, `$eval` / `$jsEval` / `bot.evalCommand`. Intent bawaan bertambah `GuildModeration` dan `GuildVoiceStates`.
|
|
794
|
+
- **1.0.0**: rilis pertama.
|
|
795
|
+
|
|
796
|
+
## Lisensi
|
|
797
|
+
|
|
798
|
+
MIT
|