rynkai 0.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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/core/Client.d.ts +46 -0
  4. package/dist/core/Client.d.ts.map +1 -0
  5. package/dist/core/Client.js +183 -0
  6. package/dist/core/Client.js.map +1 -0
  7. package/dist/core/Middleware.d.ts +27 -0
  8. package/dist/core/Middleware.d.ts.map +1 -0
  9. package/dist/core/Middleware.js +26 -0
  10. package/dist/core/Middleware.js.map +1 -0
  11. package/dist/core/RateLimiter.d.ts +24 -0
  12. package/dist/core/RateLimiter.d.ts.map +1 -0
  13. package/dist/core/RateLimiter.js +40 -0
  14. package/dist/core/RateLimiter.js.map +1 -0
  15. package/dist/index.d.ts +11 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +18 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/message/MessageBuilder.d.ts +25 -0
  20. package/dist/message/MessageBuilder.d.ts.map +1 -0
  21. package/dist/message/MessageBuilder.js +29 -0
  22. package/dist/message/MessageBuilder.js.map +1 -0
  23. package/dist/message/MessageParser.d.ts +8 -0
  24. package/dist/message/MessageParser.d.ts.map +1 -0
  25. package/dist/message/MessageParser.js +80 -0
  26. package/dist/message/MessageParser.js.map +1 -0
  27. package/dist/plugin/PluginLoader.d.ts +21 -0
  28. package/dist/plugin/PluginLoader.d.ts.map +1 -0
  29. package/dist/plugin/PluginLoader.js +113 -0
  30. package/dist/plugin/PluginLoader.js.map +1 -0
  31. package/dist/session/FileSessionStore.d.ts +17 -0
  32. package/dist/session/FileSessionStore.d.ts.map +1 -0
  33. package/dist/session/FileSessionStore.js +74 -0
  34. package/dist/session/FileSessionStore.js.map +1 -0
  35. package/dist/session/MongoSessionStore.d.ts +25 -0
  36. package/dist/session/MongoSessionStore.d.ts.map +1 -0
  37. package/dist/session/MongoSessionStore.js +103 -0
  38. package/dist/session/MongoSessionStore.js.map +1 -0
  39. package/dist/types/index.d.ts +76 -0
  40. package/dist/types/index.d.ts.map +1 -0
  41. package/dist/types/index.js +3 -0
  42. package/dist/types/index.js.map +1 -0
  43. package/package.json +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBuilder.js","sourceRoot":"","sources":["../../src/message/MessageBuilder.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACU,QAAA,cAAc,GAAG;IAC5B,IAAI,CAAC,IAAY;QACf,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,MAAgC,EAAE,OAAgB;QACtD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,MAAgC,EAAE,OAAgB;QACtD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,MAAgC,EAAE,GAAG,GAAG,KAAK;QACjD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,MAAgC;QACtC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,QAAQ,CAAC,MAAgC,EAAE,QAAgB,EAAE,QAAQ,GAAG,0BAA0B;QAChG,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAClD,CAAC;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { proto } from '@whiskeysockets/baileys';
2
+ import type { NormalizedMessage } from '../types';
3
+ /**
4
+ * Ubah proto.IWebMessageInfo mentah dari Baileys jadi NormalizedMessage
5
+ * yang lebih enak dipakai plugin/consumer library.
6
+ */
7
+ export declare function parseMessage(raw: proto.IWebMessageInfo): NormalizedMessage;
8
+ //# sourceMappingURL=MessageParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageParser.d.ts","sourceRoot":"","sources":["../../src/message/MessageParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAyB,MAAM,UAAU,CAAC;AAmDzE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,eAAe,GAAG,iBAAiB,CAiB1E"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseMessage = parseMessage;
4
+ /**
5
+ * Deteksi tipe pesan dari struktur proto Baileys yang aslinya
6
+ * nested & berbeda-beda per jenis media. Kita ratain jadi satu enum simpel.
7
+ */
8
+ function detectType(msg) {
9
+ if (!msg)
10
+ return 'unknown';
11
+ if (msg.conversation || msg.extendedTextMessage)
12
+ return 'text';
13
+ if (msg.imageMessage)
14
+ return 'image';
15
+ if (msg.videoMessage)
16
+ return 'video';
17
+ if (msg.audioMessage)
18
+ return 'audio';
19
+ if (msg.stickerMessage)
20
+ return 'sticker';
21
+ if (msg.documentMessage)
22
+ return 'document';
23
+ if (msg.locationMessage)
24
+ return 'location';
25
+ if (msg.contactMessage)
26
+ return 'contact';
27
+ if (msg.reactionMessage)
28
+ return 'reaction';
29
+ return 'unknown';
30
+ }
31
+ /** Ambil teks dari berbagai kemungkinan lokasi (conversation, caption, dst) */
32
+ function extractText(msg) {
33
+ if (!msg)
34
+ return '';
35
+ return (msg.conversation ||
36
+ msg.extendedTextMessage?.text ||
37
+ msg.imageMessage?.caption ||
38
+ msg.videoMessage?.caption ||
39
+ msg.documentMessage?.caption ||
40
+ '');
41
+ }
42
+ function parseQuoted(msg) {
43
+ const ctx = msg?.extendedTextMessage?.contextInfo;
44
+ const quotedRaw = ctx?.quotedMessage;
45
+ if (!quotedRaw || !ctx?.stanzaId)
46
+ return null;
47
+ return {
48
+ id: ctx.stanzaId,
49
+ sender: ctx.participant || '',
50
+ chatId: ctx.participant || '',
51
+ isGroup: false,
52
+ type: detectType(quotedRaw),
53
+ text: extractText(quotedRaw),
54
+ fromMe: false,
55
+ timestamp: 0,
56
+ raw: { key: { id: ctx.stanzaId }, message: quotedRaw },
57
+ };
58
+ }
59
+ /**
60
+ * Ubah proto.IWebMessageInfo mentah dari Baileys jadi NormalizedMessage
61
+ * yang lebih enak dipakai plugin/consumer library.
62
+ */
63
+ function parseMessage(raw) {
64
+ const chatId = raw.key.remoteJid || '';
65
+ const isGroup = chatId.endsWith('@g.us');
66
+ const sender = isGroup ? raw.key.participant || chatId : chatId;
67
+ return {
68
+ id: raw.key.id || '',
69
+ sender,
70
+ chatId,
71
+ isGroup,
72
+ type: detectType(raw.message),
73
+ text: extractText(raw.message),
74
+ fromMe: raw.key.fromMe || false,
75
+ timestamp: Number(raw.messageTimestamp) || Math.floor(Date.now() / 1000),
76
+ quoted: parseQuoted(raw.message),
77
+ raw,
78
+ };
79
+ }
80
+ //# sourceMappingURL=MessageParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageParser.js","sourceRoot":"","sources":["../../src/message/MessageParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Plugin, PluginContext } from '../types';
2
+ export declare class PluginLoader {
3
+ private plugins;
4
+ private cooldowns;
5
+ /** Register satu plugin secara manual (tanpa baca dari file) */
6
+ register(plugin: Plugin): void;
7
+ /**
8
+ * Load semua file .js/.ts di sebuah folder sebagai plugin.
9
+ * Tiap file harus `export default` object yang match interface Plugin,
10
+ * atau `module.exports = {...}` (kompatibel dengan gaya rynk4 lama).
11
+ */
12
+ loadFromDirectory(dir: string): Promise<number>;
13
+ /** Cari plugin berdasarkan nama command (tanpa prefix) */
14
+ find(command: string): Plugin | undefined;
15
+ /** Cek & catat cooldown. Return sisa detik kalau masih kena cooldown, 0 kalau boleh jalan. */
16
+ checkCooldown(plugin: Plugin, userId: string): number;
17
+ /** Jalankan plugin yang cocok untuk sebuah context. Return true kalau ada plugin yang dieksekusi. */
18
+ execute(command: string, ctx: PluginContext): Promise<boolean>;
19
+ list(): Plugin[];
20
+ }
21
+ //# sourceMappingURL=PluginLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginLoader.d.ts","sourceRoot":"","sources":["../../src/plugin/PluginLoader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEtD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA6B;IAE5C,OAAO,CAAC,SAAS,CAA6B;IAE9C,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO9B;;;;OAIG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2BrD,0DAA0D;IAC1D,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzC,8FAA8F;IAC9F,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAerD,qGAAqG;IAC/F,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAcpE,IAAI,IAAI,MAAM,EAAE;CAGjB"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PluginLoader = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ class PluginLoader {
40
+ constructor() {
41
+ this.plugins = new Map();
42
+ // key: `${pluginName}:${userId}` -> timestamp boleh pakai lagi
43
+ this.cooldowns = new Map();
44
+ }
45
+ /** Register satu plugin secara manual (tanpa baca dari file) */
46
+ register(plugin) {
47
+ const commands = Array.isArray(plugin.command) ? plugin.command : [plugin.command];
48
+ for (const cmd of commands) {
49
+ this.plugins.set(cmd.toLowerCase(), plugin);
50
+ }
51
+ }
52
+ /**
53
+ * Load semua file .js/.ts di sebuah folder sebagai plugin.
54
+ * Tiap file harus `export default` object yang match interface Plugin,
55
+ * atau `module.exports = {...}` (kompatibel dengan gaya rynk4 lama).
56
+ */
57
+ async loadFromDirectory(dir) {
58
+ if (!fs.existsSync(dir)) {
59
+ throw new Error(`Plugin directory tidak ditemukan: ${dir}`);
60
+ }
61
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith('.js') || f.endsWith('.ts'));
62
+ let count = 0;
63
+ for (const file of files) {
64
+ const fullPath = path.join(dir, file);
65
+ delete require.cache[require.resolve(fullPath)];
66
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
67
+ const mod = require(fullPath);
68
+ const plugin = mod.default || mod;
69
+ if (!plugin?.name || !plugin?.command || typeof plugin.execute !== 'function') {
70
+ console.warn(`[rynkai] Melewati "${file}": tidak sesuai format Plugin (butuh name, command, execute)`);
71
+ continue;
72
+ }
73
+ this.register(plugin);
74
+ count++;
75
+ }
76
+ return count;
77
+ }
78
+ /** Cari plugin berdasarkan nama command (tanpa prefix) */
79
+ find(command) {
80
+ return this.plugins.get(command.toLowerCase());
81
+ }
82
+ /** Cek & catat cooldown. Return sisa detik kalau masih kena cooldown, 0 kalau boleh jalan. */
83
+ checkCooldown(plugin, userId) {
84
+ if (!plugin.cooldown)
85
+ return 0;
86
+ const key = `${plugin.name}:${userId}`;
87
+ const readyAt = this.cooldowns.get(key) || 0;
88
+ const now = Date.now();
89
+ if (now < readyAt) {
90
+ return Math.ceil((readyAt - now) / 1000);
91
+ }
92
+ this.cooldowns.set(key, now + plugin.cooldown * 1000);
93
+ return 0;
94
+ }
95
+ /** Jalankan plugin yang cocok untuk sebuah context. Return true kalau ada plugin yang dieksekusi. */
96
+ async execute(command, ctx) {
97
+ const plugin = this.find(command);
98
+ if (!plugin)
99
+ return false;
100
+ const remaining = this.checkCooldown(plugin, ctx.message.sender);
101
+ if (remaining > 0) {
102
+ await ctx.reply(`Tunggu ${remaining} detik lagi sebelum pakai perintah ini lagi.`);
103
+ return true;
104
+ }
105
+ await plugin.execute(ctx);
106
+ return true;
107
+ }
108
+ list() {
109
+ return [...new Set(this.plugins.values())];
110
+ }
111
+ }
112
+ exports.PluginLoader = PluginLoader;
113
+ //# sourceMappingURL=PluginLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginLoader.js","sourceRoot":"","sources":["../../src/plugin/PluginLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type AuthenticationState } from '@whiskeysockets/baileys';
2
+ import type { SessionStore } from '../types';
3
+ /**
4
+ * Session store default: simpan auth state sebagai file JSON di disk,
5
+ * satu folder per sesi. Cocok buat single-instance bot / development.
6
+ * Untuk multi-instance atau deployment yang butuh shared state, buat
7
+ * SessionStore custom (misal MongoSessionStore) yang implement interface yang sama.
8
+ */
9
+ export declare class FileSessionStore implements SessionStore {
10
+ private folder;
11
+ private saveCreds;
12
+ constructor(sessionName: string, baseDir?: string);
13
+ load(): Promise<AuthenticationState | null>;
14
+ save(_state: AuthenticationState): Promise<void>;
15
+ clear(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=FileSessionStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileSessionStore.d.ts","sourceRoot":"","sources":["../../src/session/FileSessionStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,SAAS,CAAsC;gBAE3C,WAAW,EAAE,MAAM,EAAE,OAAO,SAAqB;IAIvD,IAAI,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAM3C,IAAI,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.FileSessionStore = void 0;
37
+ const baileys_1 = require("@whiskeysockets/baileys");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ /**
41
+ * Session store default: simpan auth state sebagai file JSON di disk,
42
+ * satu folder per sesi. Cocok buat single-instance bot / development.
43
+ * Untuk multi-instance atau deployment yang butuh shared state, buat
44
+ * SessionStore custom (misal MongoSessionStore) yang implement interface yang sama.
45
+ */
46
+ class FileSessionStore {
47
+ constructor(sessionName, baseDir = '.rynkai-sessions') {
48
+ // Baileys expose saveCreds sebagai closure dari useMultiFileAuthState,
49
+ // kita simpan referensinya di sini setelah load() pertama dipanggil.
50
+ this.saveCreds = null;
51
+ this.folder = path.join(baseDir, sessionName);
52
+ }
53
+ async load() {
54
+ const { state, saveCreds } = await (0, baileys_1.useMultiFileAuthState)(this.folder);
55
+ this.saveCreds = saveCreds;
56
+ return state;
57
+ }
58
+ async save(_state) {
59
+ // useMultiFileAuthState sudah otomatis nulis ke disk tiap kali keys/creds
60
+ // berubah lewat event 'creds.update' — kita cukup panggil saveCreds
61
+ // yang di-provide-nya. Lihat ConnectionManager untuk pemanggilannya.
62
+ if (this.saveCreds) {
63
+ await this.saveCreds();
64
+ }
65
+ }
66
+ async clear() {
67
+ if (fs.existsSync(this.folder)) {
68
+ fs.rmSync(this.folder, { recursive: true, force: true });
69
+ }
70
+ this.saveCreds = null;
71
+ }
72
+ }
73
+ exports.FileSessionStore = FileSessionStore;
74
+ //# sourceMappingURL=FileSessionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileSessionStore.js","sourceRoot":"","sources":["../../src/session/FileSessionStore.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAA0F;AAC1F,uCAAyB;AACzB,2CAA6B;AAG7B;;;;;GAKG;AACH,MAAa,gBAAgB;IAM3B,YAAY,WAAmB,EAAE,OAAO,GAAG,kBAAkB;QAJ7D,uEAAuE;QACvE,qEAAqE;QAC7D,cAAS,GAAiC,IAAI,CAAC;QAGrD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,+BAAqB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAA2B;QACpC,0EAA0E;QAC1E,oEAAoE;QACpE,qEAAqE;QACrE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;CACF;AA/BD,4CA+BC"}
@@ -0,0 +1,25 @@
1
+ import type { AuthenticationState } from '@whiskeysockets/baileys';
2
+ import type { SessionStore } from '../types';
3
+ /**
4
+ * Session store berbasis MongoDB/Mongoose — cocok buat rynk4 atau setup lain
5
+ * yang sudah pakai Mongo dan butuh sesi WA yang persist di database, bukan
6
+ * di filesystem lokal (misal deployment multi-instance atau ephemeral disk).
7
+ *
8
+ * Prasyarat:
9
+ * 1. `npm install mongoose` (tidak ikut ter-install otomatis, biar library
10
+ * ini tetap ringan buat yang cuma pakai FileSessionStore).
11
+ * 2. Koneksi mongoose sudah dibuka (`mongoose.connect()`) sebelum
12
+ * `client.connect()` dipanggil — store ini tidak buka koneksi sendiri,
13
+ * biar konsisten sama koneksi yang dipakai bagian lain aplikasi.
14
+ */
15
+ export declare class MongoSessionStore implements SessionStore {
16
+ private sessionName;
17
+ constructor(sessionName: string);
18
+ private getValue;
19
+ private setValue;
20
+ private deleteValue;
21
+ load(): Promise<AuthenticationState | null>;
22
+ save(state: AuthenticationState): Promise<void>;
23
+ clear(): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=MongoSessionStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoSessionStore.d.ts","sourceRoot":"","sources":["../../src/session/MongoSessionStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAA0C,MAAM,yBAAyB,CAAC;AAK3G,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAoC7C;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACxC,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM;YAMzB,QAAQ;YAMR,QAAQ;YASR,WAAW;IAInB,IAAI,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAuC3C,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoSessionStore = void 0;
4
+ const baileys_1 = require("@whiskeysockets/baileys");
5
+ let SessionModel = null;
6
+ function loadMongoose() {
7
+ try {
8
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
9
+ return require('mongoose');
10
+ }
11
+ catch {
12
+ throw new Error('[rynkai] MongoSessionStore butuh package "mongoose" tapi belum terinstall. ' +
13
+ 'Jalankan: npm install mongoose');
14
+ }
15
+ }
16
+ function getModel() {
17
+ if (!SessionModel) {
18
+ const mongoose = loadMongoose();
19
+ const schema = new mongoose.Schema({
20
+ sessionName: { type: String, required: true, index: true },
21
+ key: { type: String, required: true },
22
+ value: { type: String, required: true },
23
+ });
24
+ schema.index({ sessionName: 1, key: 1 }, { unique: true });
25
+ SessionModel = mongoose.model('RynkaiSession', schema);
26
+ }
27
+ return SessionModel;
28
+ }
29
+ /**
30
+ * Session store berbasis MongoDB/Mongoose — cocok buat rynk4 atau setup lain
31
+ * yang sudah pakai Mongo dan butuh sesi WA yang persist di database, bukan
32
+ * di filesystem lokal (misal deployment multi-instance atau ephemeral disk).
33
+ *
34
+ * Prasyarat:
35
+ * 1. `npm install mongoose` (tidak ikut ter-install otomatis, biar library
36
+ * ini tetap ringan buat yang cuma pakai FileSessionStore).
37
+ * 2. Koneksi mongoose sudah dibuka (`mongoose.connect()`) sebelum
38
+ * `client.connect()` dipanggil — store ini tidak buka koneksi sendiri,
39
+ * biar konsisten sama koneksi yang dipakai bagian lain aplikasi.
40
+ */
41
+ class MongoSessionStore {
42
+ constructor(sessionName) {
43
+ this.sessionName = sessionName;
44
+ // Validasi mongoose ada dari awal, biar error langsung ketauan
45
+ // di constructor, bukan pas load() dipanggil di tengah connect().
46
+ loadMongoose();
47
+ }
48
+ async getValue(key) {
49
+ const doc = await getModel().findOne({ sessionName: this.sessionName, key }).lean();
50
+ if (!doc)
51
+ return null;
52
+ return JSON.parse(doc.value, baileys_1.BufferJSON.reviver);
53
+ }
54
+ async setValue(key, value) {
55
+ const serialized = JSON.stringify(value, baileys_1.BufferJSON.replacer);
56
+ await getModel().updateOne({ sessionName: this.sessionName, key }, { $set: { value: serialized } }, { upsert: true });
57
+ }
58
+ async deleteValue(key) {
59
+ await getModel().deleteOne({ sessionName: this.sessionName, key });
60
+ }
61
+ async load() {
62
+ let creds = await this.getValue('creds');
63
+ if (!creds) {
64
+ creds = (0, baileys_1.initAuthCreds)();
65
+ await this.setValue('creds', creds);
66
+ }
67
+ const keys = {
68
+ get: async (type, ids) => {
69
+ const result = {};
70
+ await Promise.all(ids.map(async (id) => {
71
+ const value = await this.getValue(`${type}-${id}`);
72
+ if (value) {
73
+ result[id] =
74
+ type === 'app-state-sync-key'
75
+ ? baileys_1.proto.Message.AppStateSyncKeyData.fromObject(value)
76
+ : value;
77
+ }
78
+ }));
79
+ return result;
80
+ },
81
+ set: async (data) => {
82
+ const tasks = [];
83
+ for (const type in data) {
84
+ for (const id in data[type]) {
85
+ const value = data[type]?.[id];
86
+ const key = `${type}-${id}`;
87
+ tasks.push(value ? this.setValue(key, value) : this.deleteValue(key));
88
+ }
89
+ }
90
+ await Promise.all(tasks);
91
+ },
92
+ };
93
+ return { creds, keys };
94
+ }
95
+ async save(state) {
96
+ await this.setValue('creds', state.creds);
97
+ }
98
+ async clear() {
99
+ await getModel().deleteMany({ sessionName: this.sessionName });
100
+ }
101
+ }
102
+ exports.MongoSessionStore = MongoSessionStore;
103
+ //# sourceMappingURL=MongoSessionStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoSessionStore.js","sourceRoot":"","sources":["../../src/session/MongoSessionStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { WASocket, AuthenticationState, proto } from '@whiskeysockets/baileys';
2
+ /** Jenis pesan yang sudah dinormalisasi, dipakai di seluruh library (bukan raw proto Baileys) */
3
+ export type NormalizedMessageType = 'text' | 'image' | 'video' | 'audio' | 'sticker' | 'document' | 'location' | 'contact' | 'reaction' | 'unknown';
4
+ export interface NormalizedMessage {
5
+ /** ID unik pesan dari WhatsApp */
6
+ id: string;
7
+ /** JID pengirim (selalu individual, walau dari grup) */
8
+ sender: string;
9
+ /** JID chat asal (bisa grup atau individual) */
10
+ chatId: string;
11
+ /** true kalau pesan datang dari grup */
12
+ isGroup: boolean;
13
+ /** Tipe pesan yang sudah disederhanakan */
14
+ type: NormalizedMessageType;
15
+ /** Isi teks (caption untuk media, body untuk text) */
16
+ text: string;
17
+ /** true kalau pesan ini dari bot sendiri */
18
+ fromMe: boolean;
19
+ /** Unix timestamp (detik) */
20
+ timestamp: number;
21
+ /** Pesan yang di-quote/reply, kalau ada (sudah dinormalisasi juga, minus quotedMessage-nya sendiri) */
22
+ quoted: Omit<NormalizedMessage, 'quoted'> | null;
23
+ /** Raw proto message asli dari Baileys, buat kasus yang butuh akses low-level */
24
+ raw: proto.IWebMessageInfo;
25
+ }
26
+ export interface SessionStore {
27
+ /** Load auth state tersimpan. Return null kalau belum ada sesi. */
28
+ load(): Promise<AuthenticationState | null>;
29
+ /** Simpan/update auth state (dipanggil tiap ada perubahan credential/keys) */
30
+ save(state: AuthenticationState): Promise<void>;
31
+ /** Hapus sesi tersimpan (dipanggil saat logout) */
32
+ clear(): Promise<void>;
33
+ }
34
+ export interface PluginContext {
35
+ client: WASocket;
36
+ message: NormalizedMessage;
37
+ args: string[];
38
+ /** Reply cepat ke chat asal pesan, otomatis quote pesan yang memicu */
39
+ reply: (text: string) => Promise<void>;
40
+ }
41
+ export interface Plugin {
42
+ name: string;
43
+ command: string | string[];
44
+ category?: string;
45
+ description?: string;
46
+ /** Cooldown per-user dalam detik, opsional */
47
+ cooldown?: number;
48
+ execute: (ctx: PluginContext) => Promise<void> | void;
49
+ }
50
+ export interface RynkaiConfig {
51
+ /** Nama sesi, dipakai sebagai default folder/key penyimpanan */
52
+ sessionName: string;
53
+ /** Session store custom. Default: FileSessionStore */
54
+ sessionStore?: SessionStore;
55
+ /** Prefix command untuk plugin, default "." */
56
+ prefix?: string;
57
+ /** Pakai pairing code (nomor HP) alih-alih QR */
58
+ pairingCode?: {
59
+ phoneNumber: string;
60
+ };
61
+ /** Cetak QR ke terminal, default true kalau tidak pakai pairingCode */
62
+ printQR?: boolean;
63
+ /** Level log Baileys/pino, default "silent" */
64
+ logLevel?: 'silent' | 'error' | 'warn' | 'info' | 'debug' | 'trace';
65
+ /**
66
+ * Rate limit global per user (terpisah dari cooldown per-plugin).
67
+ * Kalau tidak diisi, tidak ada rate limit global yang aktif.
68
+ */
69
+ rateLimit?: {
70
+ /** Maksimal command dalam satu window */
71
+ max: number;
72
+ /** Panjang window dalam milidetik */
73
+ windowMs: number;
74
+ };
75
+ }
76
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEpF,iGAAiG;AACjG,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,SAAS,GACT,UAAU,GACV,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,IAAI,EAAE,qBAAqB,CAAC;IAC5B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,uGAAuG;IACvG,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACjD,iFAAiF;IACjF,GAAG,EAAE,KAAK,CAAC,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,IAAI,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAC5C,8EAA8E;IAC9E,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,mDAAmD;IACnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,CAAC;IACjB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,uEAAuE;IACvE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,WAAW,CAAC,EAAE;QACZ,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACpE;;;OAGG;IACH,SAAS,CAAC,EAAE;QACV,yCAAyC;QACzC,GAAG,EAAE,MAAM,CAAC;QACZ,qCAAqC;QACrC,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "rynkai",
3
+ "version": "0.1.0",
4
+ "description": "Clean, typed wrapper around Baileys with built-in plugin system and pluggable session store — for building WhatsApp bots fast.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "commonjs",
8
+ "scripts": {
9
+ "build": "tsc -p tsconfig.json",
10
+ "dev": "ts-node-dev --respawn --transpile-only src/index.ts",
11
+ "prepublishOnly": "npm run build"
12
+ },
13
+ "keywords": ["whatsapp", "bot", "baileys", "wrapper", "plugin"],
14
+ "license": "MIT",
15
+ "author": "rynk",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/rynk433/rynkai.git"
19
+ },
20
+ "homepage": "https://github.com/rynk433/rynkai#readme",
21
+ "bugs": {
22
+ "url": "https://github.com/rynk433/rynkai/issues"
23
+ },
24
+ "dependencies": {
25
+ "@whiskeysockets/baileys": "^6.7.9",
26
+ "@hapi/boom": "^10.0.1",
27
+ "pino": "^9.4.0"
28
+ },
29
+ "peerDependencies": {
30
+ "qrcode-terminal": "^0.12.0",
31
+ "mongoose": "^8.0.0"
32
+ },
33
+ "peerDependenciesMeta": {
34
+ "qrcode-terminal": {
35
+ "optional": true
36
+ },
37
+ "mongoose": {
38
+ "optional": true
39
+ }
40
+ },
41
+ "devDependencies": {
42
+ "typescript": "^5.5.4",
43
+ "ts-node-dev": "^2.0.0",
44
+ "@types/node": "^20.14.0",
45
+ "mongoose": "^8.0.0"
46
+ },
47
+ "files": ["dist"]
48
+ }