@tryty/easydc-js 0.0.0-stage → 1.2.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 +912 -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/examples/mongo.js +44 -0
- package/index.d.ts +150 -0
- package/mongodb.d.ts +31 -0
- package/package.json +53 -4
- package/src/bot.js +868 -0
- package/src/context.js +218 -0
- package/src/database.js +96 -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 +41 -0
- package/src/index.js +20 -0
- package/src/interpreter.js +88 -0
- package/src/parser.js +168 -0
- package/src/plugins/mongodb.js +140 -0
- package/src/util.js +188 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Contoh fitur v1.1: modal, autocomplete, menu klik-kanan, poll, event baru.
|
|
2
|
+
// Dimuat dengan: bot.loadCommands('./examples/advanced')
|
|
3
|
+
module.exports = [
|
|
4
|
+
// --- Modal: slash command membuka form, lalu handler membaca isinya ---
|
|
5
|
+
{
|
|
6
|
+
type: 'slash',
|
|
7
|
+
name: 'lapor',
|
|
8
|
+
description: 'Kirim laporan lewat form',
|
|
9
|
+
code: `
|
|
10
|
+
$addModal[lapor_form;Form Laporan]
|
|
11
|
+
$addTextInput[judul;Judul;short;Ringkas saja;true;3;50]
|
|
12
|
+
$addTextInput[isi;Isi laporan;paragraph]
|
|
13
|
+
`,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
type: 'modal',
|
|
17
|
+
customId: 'lapor_form',
|
|
18
|
+
code: '$ephemeral Terima kasih $username! Judul: $modalValue[judul] | Isi: $modalValue[isi]',
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
// --- Autocomplete ---
|
|
22
|
+
{
|
|
23
|
+
type: 'slash',
|
|
24
|
+
name: 'buah',
|
|
25
|
+
description: 'Pilih buah',
|
|
26
|
+
options: [{ name: 'nama', description: 'Nama buah', autocomplete: true }],
|
|
27
|
+
code: 'Kamu memilih $option[nama]',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
type: 'autocomplete',
|
|
31
|
+
command: 'buah',
|
|
32
|
+
option: 'nama',
|
|
33
|
+
code: `
|
|
34
|
+
$addChoice[Apel;apel]
|
|
35
|
+
$addChoice[Jeruk;jeruk]
|
|
36
|
+
$addChoice[Mangga;mangga]
|
|
37
|
+
`,
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
// --- Menu klik-kanan ---
|
|
41
|
+
{ type: 'contextMenu', menu: 'user', name: 'Lihat Profil', code: '$ephemeral Profil: $targetName (ID $targetID)' },
|
|
42
|
+
{ type: 'contextMenu', menu: 'message', name: 'Laporkan', code: '$ephemeral Pesan "$targetContent" dari $targetName dilaporkan.' },
|
|
43
|
+
|
|
44
|
+
// --- Poll + moderasi dengan pelindung izin ---
|
|
45
|
+
{ name: 'vote', code: '$poll[Makan apa hari ini?;24;false;Nasi;Mie;Roti]' },
|
|
46
|
+
{
|
|
47
|
+
name: 'unban',
|
|
48
|
+
code: `
|
|
49
|
+
$onlyPerms[BanMembers;❌ Kamu butuh izin BanMembers.]
|
|
50
|
+
$argsCheck[1;Format: !unban <userID>]
|
|
51
|
+
$if[$isBanned[$message[1]]==false]User itu tidak sedang di-ban.$stop$endif
|
|
52
|
+
$unban[$message[1];Dicabut oleh $username]
|
|
53
|
+
✅ Ban dicabut.
|
|
54
|
+
`,
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
// --- Event baru ---
|
|
58
|
+
{ type: 'voiceJoin', code: '🔊 $username masuk ke $targetName' },
|
|
59
|
+
{ type: 'memberBan', code: '🔨 $targetName di-ban dari server.' },
|
|
60
|
+
];
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Jalankan: TOKEN=token_bot_kamu node examples/basic.js
|
|
2
|
+
const { Bot } = require('easydc-js'); // saat dicoba dari folder ini: require('../src')
|
|
3
|
+
|
|
4
|
+
const bot = new Bot({
|
|
5
|
+
token: process.env.TOKEN,
|
|
6
|
+
prefix: '!',
|
|
7
|
+
owners: [], // isi ID Discord kamu agar $onlyOwner berfungsi
|
|
8
|
+
timezone: 'Asia/Jakarta',
|
|
9
|
+
status: { text: '!help', type: 'Listening' },
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
// Variabel yang disimpan permanen di database (harus dideklarasikan + nilai awal)
|
|
13
|
+
bot.variables({ uang: 100 });
|
|
14
|
+
|
|
15
|
+
bot.command({ name: 'ping', code: '🏓 Pong! $ping ms' });
|
|
16
|
+
|
|
17
|
+
bot.command({
|
|
18
|
+
name: 'help',
|
|
19
|
+
code: `
|
|
20
|
+
$title[Daftar perintah]
|
|
21
|
+
$description[\`!ping\` \`!uang\` \`!kerja\` \`!ulang\` \`!ban\`]
|
|
22
|
+
$color[blurple]
|
|
23
|
+
`,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
bot.command({
|
|
27
|
+
name: 'uang',
|
|
28
|
+
code: '💰 $username punya $numberSeparator[$getUserVar[uang];.] koin',
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
bot.command({
|
|
32
|
+
name: 'kerja',
|
|
33
|
+
code: `
|
|
34
|
+
$cooldown[1m;Kamu capek, istirahat %time% lagi.]
|
|
35
|
+
$let[gaji;$random[10;50]]
|
|
36
|
+
$setUserVar[uang;$math[$getUserVar[uang]+$get[gaji]]]
|
|
37
|
+
Kamu kerja dan dapat $get[gaji] koin! Total: $getUserVar[uang]
|
|
38
|
+
`,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
bot.command({
|
|
42
|
+
name: 'ulang',
|
|
43
|
+
code: `
|
|
44
|
+
$argsCheck[2;Format: !ulang <kata> <jumlah>]
|
|
45
|
+
$repeat[$message[1] ;$message[2]]
|
|
46
|
+
`,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Contoh if / else
|
|
50
|
+
bot.command({
|
|
51
|
+
name: 'cek',
|
|
52
|
+
code: `
|
|
53
|
+
$if[$isAdmin==true]
|
|
54
|
+
Kamu admin 👑
|
|
55
|
+
$elseif[$hasRole[ISI_ID_ROLE]==true]
|
|
56
|
+
Kamu anggota 🙂
|
|
57
|
+
$else
|
|
58
|
+
Kamu tamu 👋
|
|
59
|
+
$endif
|
|
60
|
+
`,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Moderasi: SELALU lindungi dengan $onlyPerms
|
|
64
|
+
bot.command({
|
|
65
|
+
name: 'ban',
|
|
66
|
+
code: `
|
|
67
|
+
$onlyPerms[BanMembers;❌ Kamu butuh izin BanMembers.]
|
|
68
|
+
$onlyBotPerms[BanMembers;❌ Bot tidak punya izin BanMembers.]
|
|
69
|
+
$argsCheck[1;Format: !ban @user alasan]
|
|
70
|
+
$ban[$mentioned[1];Dibanned oleh $username]
|
|
71
|
+
✅ Berhasil ban <@$mentioned[1]>
|
|
72
|
+
`,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Slash command
|
|
76
|
+
bot.slashCommand({
|
|
77
|
+
name: 'halo',
|
|
78
|
+
description: 'Menyapa seseorang',
|
|
79
|
+
options: [{ name: 'nama', description: 'Siapa yang disapa', type: 'string', required: true }],
|
|
80
|
+
code: 'Halo, $option[nama]! 👋',
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// Tombol
|
|
84
|
+
bot.command({
|
|
85
|
+
name: 'tombol',
|
|
86
|
+
code: `
|
|
87
|
+
Tekan tombolnya:
|
|
88
|
+
$addButton[Klik aku;primary;klik_1]
|
|
89
|
+
$addButton[Website;link;https://discord.js.org]
|
|
90
|
+
`,
|
|
91
|
+
});
|
|
92
|
+
bot.button({ customId: 'klik_*', code: '$ephemeral Kamu menekan `$customID`' });
|
|
93
|
+
|
|
94
|
+
// Event
|
|
95
|
+
bot.onMemberJoin('Selamat datang $mention di **$serverName**! 🎉');
|
|
96
|
+
|
|
97
|
+
bot.connect().then(() => console.log('Bot sedang login...')).catch((e) => {
|
|
98
|
+
console.error(e.message);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Satu file boleh berisi banyak command (array) dan jenis berbeda (type).
|
|
2
|
+
module.exports = [
|
|
3
|
+
{
|
|
4
|
+
name: 'profil',
|
|
5
|
+
code: `
|
|
6
|
+
$cooldown[5s;Tunggu %time% ya.]
|
|
7
|
+
$newEmbed
|
|
8
|
+
$title[Profil $username[$mentioned[1;yes]]]
|
|
9
|
+
$thumbnail[$userAvatar[$mentioned[1;yes]]]
|
|
10
|
+
$color[#5865F2]
|
|
11
|
+
$addField[Uang;💰 $numberSeparator[$getUserVar[uang;$mentioned[1;yes]];.];true]
|
|
12
|
+
$addField[Bergabung;<t:$round[$math[$userCreatedAt[$mentioned[1;yes]]/1000]]:D>;true]
|
|
13
|
+
$footer[Diminta oleh $username]
|
|
14
|
+
`,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
type: 'slash',
|
|
18
|
+
name: 'halo',
|
|
19
|
+
description: 'Menyapa seseorang',
|
|
20
|
+
options: [{ name: 'nama', description: 'Nama yang disapa', type: 'string', required: true }],
|
|
21
|
+
code: `Halo, $option[nama]! 👋`,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
type: 'button',
|
|
25
|
+
customId: 'klik_*',
|
|
26
|
+
code: `$ephemeral Kamu menekan tombol \`$customID\`.`,
|
|
27
|
+
},
|
|
28
|
+
];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Bot dengan database MongoDB.
|
|
2
|
+
// Pasang dulu: npm install easydc-js discord.js mongodb
|
|
3
|
+
// Jalankan: TOKEN=token_bot MONGO_URI="mongodb+srv://..." node examples/mongo.js
|
|
4
|
+
const { Bot } = require('easydc-js'); // saat dicoba dari folder ini: require('../src')
|
|
5
|
+
const { mongodb } = require('easydc-js/mongodb'); // saat dicoba dari folder ini: require('../src/plugins/mongodb')
|
|
6
|
+
|
|
7
|
+
const bot = new Bot({ token: process.env.TOKEN, prefix: '!', timezone: 'Asia/Jakarta' });
|
|
8
|
+
|
|
9
|
+
bot.use(mongodb({
|
|
10
|
+
uri: process.env.MONGO_URI,
|
|
11
|
+
dbName: 'botku',
|
|
12
|
+
// cache: false, // aktifkan baris ini jika bot dijalankan di lebih dari satu proses/server
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
bot.variables({ uang: 100 });
|
|
16
|
+
|
|
17
|
+
bot.command({ name: 'uang', code: '💰 $username punya $numberSeparator[$getUserVar[uang];.] koin' });
|
|
18
|
+
|
|
19
|
+
bot.command({
|
|
20
|
+
name: 'kerja',
|
|
21
|
+
code: `
|
|
22
|
+
$cooldown[1m;Istirahat dulu, tunggu %time%.]
|
|
23
|
+
$incUserVar[uang;$random[10;50]]
|
|
24
|
+
Kamu bekerja! Uangmu sekarang $getUserVar[uang]
|
|
25
|
+
`,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
bot.command({
|
|
29
|
+
name: 'kirim',
|
|
30
|
+
code: `
|
|
31
|
+
$argsCheck[2;Format: !kirim @user jumlah]
|
|
32
|
+
$onlyIf[$mentioned[1]!=;Mention user tujuan.]
|
|
33
|
+
$onlyIf[$isNumber[$message[2]]==true&&$message[2]>0;Jumlah harus angka lebih dari 0.]
|
|
34
|
+
$onlyIf[$getUserVar[uang]>=$message[2];Uangmu tidak cukup.]
|
|
35
|
+
$incUserVar[uang;-$message[2]]
|
|
36
|
+
$incUserVar[uang;$message[2];$mentioned[1]]
|
|
37
|
+
✅ Terkirim $message[2] koin ke <@$mentioned[1]>
|
|
38
|
+
`,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
bot.connect().then(() => console.log('Bot online, database terhubung.')).catch((e) => {
|
|
42
|
+
console.error(e.message);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
});
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { Client } from 'discord.js';
|
|
2
|
+
|
|
3
|
+
export interface BotOptions {
|
|
4
|
+
token?: string;
|
|
5
|
+
prefix?: string | string[];
|
|
6
|
+
mentionPrefix?: boolean;
|
|
7
|
+
ignoreBots?: boolean;
|
|
8
|
+
owners?: string | string[];
|
|
9
|
+
intents?: 'default' | 'all' | Array<string | number>;
|
|
10
|
+
syncSlash?: boolean;
|
|
11
|
+
slashGuild?: string | null;
|
|
12
|
+
timezone?: string;
|
|
13
|
+
allowedMentions?: object;
|
|
14
|
+
debug?: boolean;
|
|
15
|
+
handleSignals?: boolean;
|
|
16
|
+
/** Nyalakan $eval / $jsEval / bot.evalCommand (hanya untuk ID di `owners`). Bawaan: false */
|
|
17
|
+
eval?: boolean;
|
|
18
|
+
database?: { path?: string; memory?: boolean; saveDelay?: number } | DatabaseAdapter;
|
|
19
|
+
messages?: { cooldown?: string; error?: string };
|
|
20
|
+
status?: { text: string; type?: 'Playing' | 'Streaming' | 'Listening' | 'Watching' | 'Competing'; status?: 'online' | 'idle' | 'dnd' | 'invisible' };
|
|
21
|
+
onError?: (error: Error, ctx: Context) => unknown;
|
|
22
|
+
client?: Client;
|
|
23
|
+
discord?: unknown;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface CommandDef { name: string; aliases?: string[]; code: string }
|
|
27
|
+
export interface SlashOption {
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
type?: 'string' | 'integer' | 'boolean' | 'user' | 'channel' | 'role' | 'mentionable' | 'number' | 'attachment';
|
|
31
|
+
required?: boolean;
|
|
32
|
+
choices?: Array<{ name: string; value: string | number }>;
|
|
33
|
+
minValue?: number;
|
|
34
|
+
maxValue?: number;
|
|
35
|
+
minLength?: number;
|
|
36
|
+
maxLength?: number;
|
|
37
|
+
/** Pilihan dinamis; daftarkan handler dengan bot.autocomplete(). Tidak bisa bersama `choices`. */
|
|
38
|
+
autocomplete?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface AutocompleteDef { command: string; option?: string; code: string }
|
|
41
|
+
export interface ContextMenuDef { name: string; menu: 'user' | 'message'; code: string }
|
|
42
|
+
export interface SlashDef { name: string; description: string; options?: SlashOption[]; code: string }
|
|
43
|
+
export interface ComponentDef { customId: string; code: string }
|
|
44
|
+
export type EventType = 'ready' | 'memberJoin' | 'memberLeave' | 'messageDelete' | 'messageUpdate' | 'reactionAdd' | 'reactionRemove' | 'guildJoin' | 'guildLeave' | 'message'
|
|
45
|
+
| 'memberBan' | 'memberUnban' | 'channelCreate' | 'channelDelete' | 'roleCreate' | 'roleDelete' | 'threadCreate' | 'voiceJoin' | 'voiceLeave';
|
|
46
|
+
export interface EventDef { type: EventType; channel?: string; code: string }
|
|
47
|
+
export interface CustomFunction {
|
|
48
|
+
name: string;
|
|
49
|
+
params?: number;
|
|
50
|
+
min?: number;
|
|
51
|
+
max?: number;
|
|
52
|
+
brackets?: 'none' | 'optional' | 'required';
|
|
53
|
+
override?: boolean;
|
|
54
|
+
signature?: string;
|
|
55
|
+
description?: string;
|
|
56
|
+
run: (ctx: Context, args: string[]) => unknown | Promise<unknown>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export class Context {
|
|
60
|
+
bot: Bot;
|
|
61
|
+
client: Client;
|
|
62
|
+
kind: 'message' | 'slash' | 'component' | 'event';
|
|
63
|
+
guild: any;
|
|
64
|
+
channel: any;
|
|
65
|
+
member: any;
|
|
66
|
+
user: any;
|
|
67
|
+
message: any;
|
|
68
|
+
interaction: any;
|
|
69
|
+
args: string[];
|
|
70
|
+
rawArgs: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Adapter database: hanya get/set/delete yang wajib. Nilai balik boleh Promise. */
|
|
74
|
+
export interface DatabaseAdapter {
|
|
75
|
+
get(key: string): unknown | Promise<unknown>;
|
|
76
|
+
set(key: string, value: unknown): unknown | Promise<unknown>;
|
|
77
|
+
delete(key: string): unknown | Promise<unknown>;
|
|
78
|
+
has?(key: string): boolean | Promise<boolean>;
|
|
79
|
+
keys?(prefix?: string): string[] | Promise<string[]>;
|
|
80
|
+
flush?(): unknown | Promise<unknown>;
|
|
81
|
+
connect?(): Promise<void>;
|
|
82
|
+
close?(): unknown | Promise<unknown>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export class Database implements DatabaseAdapter {
|
|
86
|
+
constructor(options?: { path?: string; memory?: boolean; saveDelay?: number });
|
|
87
|
+
get(key: string): unknown;
|
|
88
|
+
set(key: string, value: unknown): void;
|
|
89
|
+
has(key: string): boolean;
|
|
90
|
+
delete(key: string): boolean;
|
|
91
|
+
keys(prefix?: string): string[];
|
|
92
|
+
flush(): void;
|
|
93
|
+
close(): void;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function copyDatabase(from: DatabaseAdapter, to: DatabaseAdapter, options?: { overwrite?: boolean; prefix?: string }): Promise<{ copied: number; skipped: number }>;
|
|
97
|
+
|
|
98
|
+
export type Plugin = ((bot: Bot, options?: unknown) => void) | { name?: string; install(bot: Bot, options?: unknown): void };
|
|
99
|
+
|
|
100
|
+
export class Bot {
|
|
101
|
+
constructor(options?: BotOptions);
|
|
102
|
+
client: Client | null;
|
|
103
|
+
db: DatabaseAdapter;
|
|
104
|
+
plugins: Map<string, unknown>;
|
|
105
|
+
command(def: CommandDef): this;
|
|
106
|
+
slashCommand(def: SlashDef): this;
|
|
107
|
+
button(def: ComponentDef): this;
|
|
108
|
+
select(def: ComponentDef): this;
|
|
109
|
+
modal(def: ComponentDef): this;
|
|
110
|
+
autocomplete(def: AutocompleteDef): this;
|
|
111
|
+
contextMenu(def: ContextMenuDef): this;
|
|
112
|
+
/** Pasang command eval siap pakai (butuh `eval: true` dan `owners`). */
|
|
113
|
+
evalCommand(def?: { name?: string; aliases?: string[] }): this;
|
|
114
|
+
event(def: EventDef): this;
|
|
115
|
+
onMemberBan(code: string | Omit<EventDef, 'type'>): this;
|
|
116
|
+
onMemberUnban(code: string | Omit<EventDef, 'type'>): this;
|
|
117
|
+
onChannelCreate(code: string | Omit<EventDef, 'type'>): this;
|
|
118
|
+
onChannelDelete(code: string | Omit<EventDef, 'type'>): this;
|
|
119
|
+
onRoleCreate(code: string | Omit<EventDef, 'type'>): this;
|
|
120
|
+
onRoleDelete(code: string | Omit<EventDef, 'type'>): this;
|
|
121
|
+
onThreadCreate(code: string | Omit<EventDef, 'type'>): this;
|
|
122
|
+
onVoiceJoin(code: string | Omit<EventDef, 'type'>): this;
|
|
123
|
+
onVoiceLeave(code: string | Omit<EventDef, 'type'>): this;
|
|
124
|
+
onReady(code: string | Omit<EventDef, 'type'>): this;
|
|
125
|
+
onMemberJoin(code: string | Omit<EventDef, 'type'>): this;
|
|
126
|
+
onMemberLeave(code: string | Omit<EventDef, 'type'>): this;
|
|
127
|
+
onMessageDelete(code: string | Omit<EventDef, 'type'>): this;
|
|
128
|
+
onMessageUpdate(code: string | Omit<EventDef, 'type'>): this;
|
|
129
|
+
onReactionAdd(code: string | Omit<EventDef, 'type'>): this;
|
|
130
|
+
onReactionRemove(code: string | Omit<EventDef, 'type'>): this;
|
|
131
|
+
onGuildJoin(code: string | Omit<EventDef, 'type'>): this;
|
|
132
|
+
onGuildLeave(code: string | Omit<EventDef, 'type'>): this;
|
|
133
|
+
onMessage(code: string | Omit<EventDef, 'type'>): this;
|
|
134
|
+
variables(vars: Record<string, string | number | boolean>): this;
|
|
135
|
+
addFunction(fn: CustomFunction): this;
|
|
136
|
+
loadCommands(dir: string): this;
|
|
137
|
+
validate(): true;
|
|
138
|
+
use(plugin: Plugin, options?: unknown): this;
|
|
139
|
+
setDatabase(adapter: DatabaseAdapter): this;
|
|
140
|
+
getVar(scope: 'user' | 'server' | 'channel' | 'global', name: string, id?: string | null): Promise<string>;
|
|
141
|
+
setVar(scope: 'user' | 'server' | 'channel' | 'global', name: string, value: unknown, id?: string | null): Promise<void>;
|
|
142
|
+
resetVar(scope: 'user' | 'server' | 'channel' | 'global', name: string, id?: string | null): Promise<void>;
|
|
143
|
+
incVar(scope: 'user' | 'server' | 'channel' | 'global', name: string, amount: number | string, id?: string | null): Promise<string>;
|
|
144
|
+
connect(token?: string): Promise<this>;
|
|
145
|
+
destroy(): Promise<void>;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export class BotError extends Error {}
|
|
149
|
+
export class ParseError extends BotError { line?: number; col?: number }
|
|
150
|
+
export class ValidationError extends BotError { problems: string[] }
|
package/mongodb.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Database } from './index';
|
|
2
|
+
|
|
3
|
+
export interface MongoOptions {
|
|
4
|
+
/** Alamat MongoDB, mis. process.env.MONGO_URI. Wajib kecuali `client` diisi. */
|
|
5
|
+
uri?: string;
|
|
6
|
+
dbName?: string;
|
|
7
|
+
/** Bawaan: "easydc" */
|
|
8
|
+
collection?: string;
|
|
9
|
+
/** Bawaan true. Matikan bila lebih dari satu proses bot memakai database yang sama. */
|
|
10
|
+
cache?: boolean;
|
|
11
|
+
cacheLimit?: number;
|
|
12
|
+
/** MongoClient milik sendiri (tidak ditutup otomatis). */
|
|
13
|
+
client?: unknown;
|
|
14
|
+
driver?: unknown;
|
|
15
|
+
clientOptions?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class MongoDatabase {
|
|
19
|
+
constructor(options: MongoOptions);
|
|
20
|
+
connect(): Promise<void>;
|
|
21
|
+
get(key: string): Promise<string | undefined>;
|
|
22
|
+
has(key: string): Promise<boolean>;
|
|
23
|
+
set(key: string, value: unknown): Promise<void>;
|
|
24
|
+
delete(key: string): Promise<boolean>;
|
|
25
|
+
keys(prefix?: string): Promise<string[]>;
|
|
26
|
+
flush(): Promise<void>;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Plugin: bot.use(mongodb({ uri, dbName })) */
|
|
31
|
+
export function mongodb(options: MongoOptions): { name: string; install(bot: unknown): void };
|
package/package.json
CHANGED
|
@@ -1,6 +1,55 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tryty/easydc-js",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Super easy Discord bot on top of discord.js: write commands with $function[arg] syntax.",
|
|
5
|
+
"main": "src/index.js",
|
|
6
|
+
"types": "index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"src",
|
|
9
|
+
"examples",
|
|
10
|
+
"index.d.ts",
|
|
11
|
+
"mongodb.d.ts",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"test": "node --test",
|
|
17
|
+
"docs": "node scripts/gen-docs.js"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"bot",
|
|
21
|
+
"discord",
|
|
22
|
+
"discord.js",
|
|
23
|
+
"easy",
|
|
24
|
+
"mongodb",
|
|
25
|
+
"plugin",
|
|
26
|
+
"wrapper"
|
|
27
|
+
],
|
|
28
|
+
"author": "",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=18.17.0"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"discord.js": "^14.16.0"
|
|
35
|
+
},
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./index.d.ts",
|
|
39
|
+
"default": "./src/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./mongodb": {
|
|
42
|
+
"types": "./mongodb.d.ts",
|
|
43
|
+
"default": "./src/plugins/mongodb.js"
|
|
44
|
+
},
|
|
45
|
+
"./package.json": "./package.json"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"mongodb": ">=5.0.0"
|
|
49
|
+
},
|
|
50
|
+
"peerDependenciesMeta": {
|
|
51
|
+
"mongodb": {
|
|
52
|
+
"optional": true
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|