rubigram 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 (114) hide show
  1. package/README.md +193 -0
  2. package/dist/bot.d.ts +24 -0
  3. package/dist/bot.d.ts.map +1 -0
  4. package/dist/bot.js +95 -0
  5. package/dist/bot.js.map +1 -0
  6. package/dist/client/api-client.d.ts +15 -0
  7. package/dist/client/api-client.d.ts.map +1 -0
  8. package/dist/client/api-client.js +127 -0
  9. package/dist/client/api-client.js.map +1 -0
  10. package/dist/client/api-error.d.ts +22 -0
  11. package/dist/client/api-error.d.ts.map +1 -0
  12. package/dist/client/api-error.js +36 -0
  13. package/dist/client/api-error.js.map +1 -0
  14. package/dist/client/types.d.ts +40 -0
  15. package/dist/client/types.d.ts.map +1 -0
  16. package/dist/client/types.js +7 -0
  17. package/dist/client/types.js.map +1 -0
  18. package/dist/context/context.d.ts +31 -0
  19. package/dist/context/context.d.ts.map +1 -0
  20. package/dist/context/context.js +144 -0
  21. package/dist/context/context.js.map +1 -0
  22. package/dist/filters/combinators.d.ts +5 -0
  23. package/dist/filters/combinators.d.ts.map +1 -0
  24. package/dist/filters/combinators.js +27 -0
  25. package/dist/filters/combinators.js.map +1 -0
  26. package/dist/filters/command.d.ts +7 -0
  27. package/dist/filters/command.d.ts.map +1 -0
  28. package/dist/filters/command.js +24 -0
  29. package/dist/filters/command.js.map +1 -0
  30. package/dist/filters/predicates.d.ts +10 -0
  31. package/dist/filters/predicates.d.ts.map +1 -0
  32. package/dist/filters/predicates.js +39 -0
  33. package/dist/filters/predicates.js.map +1 -0
  34. package/dist/filters/rate-limit.d.ts +9 -0
  35. package/dist/filters/rate-limit.d.ts.map +1 -0
  36. package/dist/filters/rate-limit.js +18 -0
  37. package/dist/filters/rate-limit.js.map +1 -0
  38. package/dist/filters/types.d.ts +5 -0
  39. package/dist/filters/types.d.ts.map +1 -0
  40. package/dist/filters/types.js +2 -0
  41. package/dist/filters/types.js.map +1 -0
  42. package/dist/index.d.ts +19 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +18 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/plugins/group/indentity.d.ts +42 -0
  47. package/dist/plugins/group/indentity.d.ts.map +1 -0
  48. package/dist/plugins/group/indentity.js +88 -0
  49. package/dist/plugins/group/indentity.js.map +1 -0
  50. package/dist/plugins/group/index.d.ts +4 -0
  51. package/dist/plugins/group/index.d.ts.map +1 -0
  52. package/dist/plugins/group/index.js +4 -0
  53. package/dist/plugins/group/index.js.map +1 -0
  54. package/dist/plugins/group/manager.d.ts +32 -0
  55. package/dist/plugins/group/manager.d.ts.map +1 -0
  56. package/dist/plugins/group/manager.js +128 -0
  57. package/dist/plugins/group/manager.js.map +1 -0
  58. package/dist/plugins/group/message-lookup.d.ts +45 -0
  59. package/dist/plugins/group/message-lookup.d.ts.map +1 -0
  60. package/dist/plugins/group/message-lookup.js +74 -0
  61. package/dist/plugins/group/message-lookup.js.map +1 -0
  62. package/dist/plugins/group/types.d.ts +36 -0
  63. package/dist/plugins/group/types.d.ts.map +1 -0
  64. package/dist/plugins/group/types.js +2 -0
  65. package/dist/plugins/group/types.js.map +1 -0
  66. package/dist/plugins/session/index.d.ts +3 -0
  67. package/dist/plugins/session/index.d.ts.map +1 -0
  68. package/dist/plugins/session/index.js +3 -0
  69. package/dist/plugins/session/index.js.map +1 -0
  70. package/dist/plugins/session/session.d.ts +5 -0
  71. package/dist/plugins/session/session.d.ts.map +1 -0
  72. package/dist/plugins/session/session.js +49 -0
  73. package/dist/plugins/session/session.js.map +1 -0
  74. package/dist/plugins/session/types.d.ts +8 -0
  75. package/dist/plugins/session/types.d.ts.map +1 -0
  76. package/dist/plugins/session/types.js +2 -0
  77. package/dist/plugins/session/types.js.map +1 -0
  78. package/dist/polling/poller.d.ts +2 -0
  79. package/dist/polling/poller.d.ts.map +1 -0
  80. package/dist/polling/poller.js +2 -0
  81. package/dist/polling/poller.js.map +1 -0
  82. package/dist/polling/types.d.ts +2 -0
  83. package/dist/polling/types.d.ts.map +1 -0
  84. package/dist/polling/types.js +2 -0
  85. package/dist/polling/types.js.map +1 -0
  86. package/dist/routing/composer.d.ts +15 -0
  87. package/dist/routing/composer.d.ts.map +1 -0
  88. package/dist/routing/composer.js +97 -0
  89. package/dist/routing/composer.js.map +1 -0
  90. package/dist/routing/types.d.ts +2 -0
  91. package/dist/routing/types.d.ts.map +1 -0
  92. package/dist/routing/types.js +2 -0
  93. package/dist/routing/types.js.map +1 -0
  94. package/dist/storage/adapter.d.ts +7 -0
  95. package/dist/storage/adapter.d.ts.map +1 -0
  96. package/dist/storage/adapter.js +2 -0
  97. package/dist/storage/adapter.js.map +1 -0
  98. package/dist/storage/memory-storage.d.ts +11 -0
  99. package/dist/storage/memory-storage.d.ts.map +1 -0
  100. package/dist/storage/memory-storage.js +45 -0
  101. package/dist/storage/memory-storage.js.map +1 -0
  102. package/dist/storage/sqlite-storage.d.ts +13 -0
  103. package/dist/storage/sqlite-storage.d.ts.map +1 -0
  104. package/dist/storage/sqlite-storage.js +74 -0
  105. package/dist/storage/sqlite-storage.js.map +1 -0
  106. package/dist/types/models.d.ts +91 -0
  107. package/dist/types/models.d.ts.map +1 -0
  108. package/dist/types/models.js +2 -0
  109. package/dist/types/models.js.map +1 -0
  110. package/dist/types/types.d.ts +4 -0
  111. package/dist/types/types.d.ts.map +1 -0
  112. package/dist/types/types.js +2 -0
  113. package/dist/types/types.js.map +1 -0
  114. package/package.json +55 -0
package/README.md ADDED
@@ -0,0 +1,193 @@
1
+ # Rubigram 🤖
2
+
3
+ ![npm](https://img.shields.io/npm/v/rubigram) ![License](https://img.shields.io/badge/license-MIT-green)
4
+
5
+ > Rubigram یک فریم‌ورک مدرن، تایپ‌سیف و ماژولار برای توسعه ربات روبیکا با استفاده از [Rubika Bot API](https://rubika.ir/botapi)، با امکانات پیشرفته و معماری قابل توسعه.
6
+
7
+ ---
8
+
9
+ ## فهرست مطالب
10
+
11
+ - [ویژگی‌ها](#ویژگیها)
12
+ - [نصب](#نصب)
13
+ - [شروع سریع](#شروع-سریع)
14
+ - [آموزش کامل استفاده](#آموزش-کامل-استفاده)
15
+ - [فرآیند پردازش میدل‌ویر](#فرآیند-پردازش-میدلویر)
16
+ - [ذخیره‌سازی و مدیریت نشست](#ذخیرهسازی-و-مدیریت-نشست)
17
+ - [افزونه مدیریت گروه](#افزونه-مدیریت-گروه)
18
+ - [API مرجع](#api-مرجع)
19
+ - [تست و اجرا](#تست-و-اجرا)
20
+ - [لایسنس](#لایسنس)
21
+
22
+ ---
23
+
24
+ ## ویژگی‌ها
25
+
26
+ - ⚡ **تایپ‌سیف و مدرن:** پیاده‌سازی کامل TypeScript با بهره‌مندی از واردسازی ESM و تایپ‌های قوی.
27
+ - 🧩 **گردش میدل‌ویر:** معماری مشابه اکسپرس برای زنجیره‌‌سازی میدل‌ویرها با متدهای `bot.use()`, `bot.command()`, `bot.hears()` و `bot.on()`.
28
+ - 💾 **ذخیره‌ساز قابل پلاگین:** پشتیبانی داخلی از `MemoryStorage` و `SqliteStorage` با امکان تعریف TTL و توسعه ذخیره‌ساز اختصاصی.
29
+ - 👥 **پکیج مدیریت گروه:** قابلیت‌های پیشرفته برای مدیریت گروه‌ها از جمله: قفل لینک، جستجوی پیام، میوت/آن‌میوت، هشدار و ردیابی اعضا.
30
+ - 🛡 **دسترسی به API رسمی:** بدون هیچ واسط یا پوشش غیراستاندارد و فقط با استفاده از Rubika Bot API رسمی.
31
+ - 📦 **توسعه‌پذیری ماژولار:** ایجاد افزونه و میدل‌ویر دلخواه و توسعه بسیار آسان.
32
+
33
+ ---
34
+
35
+ ## نصب
36
+
37
+ برای نصب با استفاده از npm کافی است:
38
+
39
+ ```bash
40
+ npm install rubigram
41
+ ```
42
+
43
+ یا با استفاده از yarn:
44
+
45
+ ```bash
46
+ yarn add rubigram
47
+ ```
48
+
49
+ ---
50
+
51
+ ## شروع سریع
52
+
53
+ یک ربات ساده بسازید:
54
+
55
+ ```typescript
56
+ import { Rubigram } from "rubigram";
57
+
58
+ const bot = new Rubigram("YOUR_BOT_TOKEN"); // توکن ربات‌تان را جایگزین کنید
59
+
60
+ // ثبت فرمان start
61
+ bot.command("start", async (ctx) => {
62
+ await ctx.reply("سلام! به روبیگرام خوش آمدید 🎉");
63
+ });
64
+
65
+ // بازتاب پیام متنی
66
+ bot.on("message", async (ctx) => {
67
+ if (ctx.text) {
68
+ await ctx.reply(`شما گفتید: ${ctx.text}`);
69
+ }
70
+ });
71
+
72
+ // آغاز دریافت پیام (Polling)
73
+ bot.start();
74
+ ```
75
+
76
+ ---
77
+
78
+ ## آموزش کامل استفاده
79
+
80
+ ### فرآیند پردازش میدل‌ویر
81
+
82
+ Rubigram قابلیت استفاده از میدل‌ویرهای چند مرحله‌ای و شخصی‌سازی شده را در اختیار شما می‌گذارد.
83
+ مثال:
84
+
85
+ ```typescript
86
+ bot.use(async (ctx, next) => {
87
+ console.log(`[${ctx.chatId}] دریافت پیام!`);
88
+ await next();
89
+ });
90
+ ```
91
+
92
+ ### ذخیره‌سازی و مدیریت نشست (Session)
93
+
94
+ برای حفظ اطلاعات هر کاربر (مثلا شمارنده یا هر داده دلخواه):
95
+
96
+ ```typescript
97
+ import { Rubigram, session, SqliteStorage } from "rubigram";
98
+
99
+ // تایپ داده دلخواه برای هر نشست کاربر
100
+ interface MySessionData {
101
+ counter: number;
102
+ }
103
+
104
+ const bot = new Rubigram("YOUR_BOT_TOKEN");
105
+ const storage = new SqliteStorage<MySessionData>({ path: "./sessions.db" });
106
+
107
+ bot.use(
108
+ session({
109
+ storage, // می‌توانید به‌جای Sqlite از MemoryStorage هم استفاده کنید
110
+ initial: () => ({ counter: 0 }),
111
+ }),
112
+ );
113
+
114
+ bot.command("count", async (ctx) => {
115
+ ctx.session.counter += 1;
116
+ await ctx.reply(`شمارشگر شما: ${ctx.session.counter}`);
117
+ });
118
+
119
+ bot.start();
120
+ ```
121
+
122
+ #### توسعه ذخیره‌ساز سفارشی
123
+
124
+ با پیاده‌سازی interface مخصوص، می‌توانید ذخیره‌سازی اختصاصی خودتان را اضافه کنید.
125
+
126
+ ### افزونه مدیریت گروه (Group Management)
127
+
128
+ همراه Rubigram یک افزونه مدیریتی کامل برای گروه‌ها ارائه شده:
129
+
130
+ ```typescript
131
+ import { Rubigram, GroupManager, MemoryStorage } from "rubigram";
132
+
133
+ const bot = new Rubigram("YOUR_BOT_TOKEN");
134
+ const groupManager = new GroupManager(new MemoryStorage());
135
+
136
+ // اتصال میدل‌ویر افزونه
137
+ bot.use(groupManager.middleware());
138
+
139
+ // مثال: قفل اشتراک‌گذاری لینک
140
+ bot.command("lock_link", async (ctx) => {
141
+ if (ctx.chatId) {
142
+ await groupManager.setLockLink(ctx.chatId, true);
143
+ await ctx.reply("🔒 اشتراک‌گذاری لینک در این گروه قفل شد.");
144
+ }
145
+ });
146
+
147
+ bot.start();
148
+ ```
149
+
150
+ قابلیت‌های گروه: قفل لینک/فایل/تصویر،‌ هشدار، میوت و ... (مستندات بیشتر: [docs/group-management.md](docs/group-management.md))
151
+
152
+ ---
153
+
154
+ ## API مرجع
155
+
156
+ Rubigram مبتنی بر TypeScript است و تمام اینترفیس‌ها، تایپ‌ها و متدهای مهم به صورت کامل مستندسازی شده‌اند.
157
+ برخی کلاس‌ها و متدهای کلیدی:
158
+
159
+ - `Rubigram`: کلاس اصلی ربات
160
+ - `bot.command(name, handler)`: ثبت دستور بات (مانند فرمان start)
161
+ - `bot.on(type, handler)`: دریافت انواع رویدادها مثل پیام
162
+ - `ctx.reply(text, [options])`: ارسال پیام
163
+ - `session({storage, initial})`: راه‌اندازی نشست کاربر
164
+ - `GroupManager`: مدیریت پیشرفته گروه
165
+ - و ...
166
+
167
+ برای مشاهده مستندات کامل تایپ‌ها به [types.ts](src/types/) مراجعه کنید.
168
+
169
+ ---
170
+
171
+ ## تست و اجرا
172
+
173
+ - اجرای پروژه:
174
+ فایلتان را با node اجرا کنید (مثلا: `node bot.js` یا با ts-node برای پروژه‌های TypeScript).
175
+ - اگر Bot Token معتبر باشد، ربات شروع به دریافت و پاسخ به پیام‌ها خواهد کرد.
176
+
177
+ ---
178
+
179
+ ## سوالات رایج
180
+
181
+ - **آیا می‌توان چند میدل‌ویر زنجیره‌ای تعریف کرد؟**
182
+ بله، هر تعداد دلخواه میدل‌ویر قابل اضافه شدن است و ترتیب اجرا رعایت می‌شود.
183
+ - **ذخیره‌سازی کجاست؟**
184
+ به صورت پیش‌فرض MemoryStorage ارایه شده، اما برای ذخیره‌سازی پایدار SQLite یا هر ذخیره‌ساز دلخواه قابل استفاده است.
185
+ - **آیا امکان توسعه افزونه وجود دارد؟**
186
+ بله، معماری کاملا باز و توسعه‌پذیر است.
187
+
188
+ ---
189
+
190
+ ## لایسنس
191
+
192
+ MIT © Mani Lipour
193
+ این پروژه متن‌‌باز است و استفاده، توسعه و گسترش آن آزاد می‌باشد.
package/dist/bot.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ import { BotClient } from "./client/api-client.js";
2
+ import type { RubikaClientOptions } from "./client/types.js";
3
+ import { Composer } from "./routing/composer.js";
4
+ import { Context } from "./context/context.js";
5
+ export interface BotOptions extends RubikaClientOptions {
6
+ pollingIntervalMs?: number;
7
+ dropPendingUpdates?: boolean;
8
+ }
9
+ export type UpdateType = "message" | "inline_message" | "all";
10
+ export type BotMiddleware = (ctx: Context, next: () => Promise<void>) => Promise<void> | void;
11
+ export type BotHandler = (ctx: Context) => Promise<void> | void;
12
+ export declare class Rubigram extends Composer {
13
+ readonly client: BotClient;
14
+ private isPolling;
15
+ private nextOffsetId;
16
+ private readonly pollingIntervalMs;
17
+ private readonly shouldDropPending;
18
+ constructor(token: string, options?: BotOptions);
19
+ private sleep;
20
+ private dropPendingUpdates;
21
+ start(): Promise<void>;
22
+ stop(): void;
23
+ }
24
+ //# sourceMappingURL=bot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,KAAK,EAAc,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,MAAM,WAAW,UAAW,SAAQ,mBAAmB;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,KAAK,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KACtB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC1B,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAOhE,qBAAa,QAAS,SAAQ,QAAQ;IACpC,SAAgB,MAAM,EAAE,SAAS,CAAC;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAE5C,YAAY,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,EAKlD;YAEa,KAAK;YAIL,kBAAkB;IAkC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAwD3B;IAED,IAAI,IAAI,IAAI,CAGX;CACF"}
package/dist/bot.js ADDED
@@ -0,0 +1,95 @@
1
+ import { BotClient } from "./client/api-client.js";
2
+ import { Composer } from "./routing/composer.js";
3
+ import { Context } from "./context/context.js";
4
+ export class Rubigram extends Composer {
5
+ client;
6
+ isPolling = false;
7
+ nextOffsetId;
8
+ pollingIntervalMs;
9
+ shouldDropPending;
10
+ constructor(token, options = {}) {
11
+ super();
12
+ this.client = new BotClient(token, options);
13
+ this.pollingIntervalMs = options.pollingIntervalMs ?? 1000;
14
+ this.shouldDropPending = options.dropPendingUpdates ?? true;
15
+ }
16
+ async sleep(ms) {
17
+ return new Promise((resolve) => setTimeout(resolve, ms));
18
+ }
19
+ async dropPendingUpdates() {
20
+ let offsetId = this.nextOffsetId;
21
+ while (true) {
22
+ const payload = {
23
+ limit: 100,
24
+ ...(offsetId ? { offset_id: offsetId } : {}),
25
+ };
26
+ const response = await this.client.call("getUpdates", payload);
27
+ const updates = response.updates ?? [];
28
+ const nextOffsetId = response.next_offset_id;
29
+ if (updates.length === 0) {
30
+ if (nextOffsetId) {
31
+ offsetId = nextOffsetId;
32
+ }
33
+ break;
34
+ }
35
+ if (!nextOffsetId || nextOffsetId === offsetId) {
36
+ break;
37
+ }
38
+ offsetId = nextOffsetId;
39
+ }
40
+ this.nextOffsetId = offsetId;
41
+ }
42
+ async start() {
43
+ if (this.isPolling) {
44
+ return;
45
+ }
46
+ this.isPolling = true;
47
+ if (this.shouldDropPending) {
48
+ try {
49
+ await this.dropPendingUpdates();
50
+ }
51
+ catch (error) {
52
+ this.isPolling = false;
53
+ console.error("❌ خطا در تخلیه پیام‌های قدیمی هنگام شروع:", error);
54
+ throw error;
55
+ }
56
+ }
57
+ while (this.isPolling) {
58
+ try {
59
+ const payload = {
60
+ limit: 50,
61
+ ...(this.nextOffsetId ? { offset_id: this.nextOffsetId } : {}),
62
+ };
63
+ const response = await this.client.call("getUpdates", payload);
64
+ if (response) {
65
+ if (response.next_offset_id) {
66
+ this.nextOffsetId = response.next_offset_id;
67
+ }
68
+ const updates = response.updates ?? [];
69
+ for (const update of updates) {
70
+ if (!this.isPolling)
71
+ break;
72
+ const ctx = new Context(this.client, update);
73
+ try {
74
+ await this.handle(ctx);
75
+ }
76
+ catch (error) {
77
+ console.error("❌ خطا در پردازش میدلور:", error);
78
+ }
79
+ }
80
+ }
81
+ }
82
+ catch (error) {
83
+ console.error("❌ خطا در حلقه Polling:", error);
84
+ }
85
+ if (this.isPolling) {
86
+ await this.sleep(this.pollingIntervalMs);
87
+ }
88
+ }
89
+ }
90
+ stop() {
91
+ this.isPolling = false;
92
+ console.log("🛑 ربات خاموش شد.");
93
+ }
94
+ }
95
+ //# sourceMappingURL=bot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { JsonObject, RequestOptions, RubikaClientOptions } from "./types.js";
2
+ export declare class BotClient {
3
+ readonly token: string;
4
+ readonly baseUrl: string;
5
+ private readonly timeoutMs;
6
+ private readonly defaultHeaders;
7
+ private readonly retries;
8
+ private readonly retryDelayMs;
9
+ constructor(token: string, options?: RubikaClientOptions);
10
+ private buildUrl;
11
+ private shouldRetry;
12
+ call<TResponse = unknown>(method: string, payload?: JsonObject, options?: RequestOptions): Promise<TResponse>;
13
+ private execute;
14
+ }
15
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/client/api-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAWpB,qBAAa,SAAS;IACpB,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,OAAO,EAAE,MAAM,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,YAAY,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,EAoB3D;IAED,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,WAAW;IAab,IAAI,CAAC,SAAS,GAAG,OAAO,EAC5B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,UAAe,EACxB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,SAAS,CAAC,CA0BpB;YAEa,OAAO;CA+EtB"}
@@ -0,0 +1,127 @@
1
+ import { RubikaApiError, RubikaHttpError, RubikaTimeoutError, } from "./api-error.js";
2
+ const DEFAULT_BASE_URL = "https://botapi.rubika.ir";
3
+ const DEFAULT_TIMEOUT_MS = 15_000;
4
+ const DEFAULT_RETRIES = 2;
5
+ const DEFAULT_RETRY_DELAY_MS = 500;
6
+ function sleep(ms) {
7
+ return new Promise((resolve) => setTimeout(resolve, ms));
8
+ }
9
+ export class BotClient {
10
+ token;
11
+ baseUrl;
12
+ timeoutMs;
13
+ defaultHeaders;
14
+ retries;
15
+ retryDelayMs;
16
+ constructor(token, options = {}) {
17
+ if (!token?.trim()) {
18
+ throw new Error("توکن بات روبیکا الزامی است.");
19
+ }
20
+ this.token = token.trim();
21
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
22
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
23
+ this.retries = Math.max(0, options.retries ?? DEFAULT_RETRIES);
24
+ this.retryDelayMs = Math.max(0, options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS);
25
+ this.defaultHeaders = {
26
+ "content-type": "application/json",
27
+ accept: "application/json",
28
+ "user-agent": "rubigram/0.1.0 (Node.js)",
29
+ ...(options.headers ?? {}),
30
+ };
31
+ }
32
+ buildUrl(method) {
33
+ return `${this.baseUrl}/v3/${this.token}/${method}`;
34
+ }
35
+ shouldRetry(error) {
36
+ if (error instanceof RubikaTimeoutError)
37
+ return true;
38
+ if (error instanceof RubikaHttpError) {
39
+ return (error.statusCode === 408 ||
40
+ error.statusCode === 425 ||
41
+ error.statusCode === 429 ||
42
+ error.statusCode >= 500);
43
+ }
44
+ return error instanceof TypeError;
45
+ }
46
+ async call(method, payload = {}, options = {}) {
47
+ if (!method?.trim()) {
48
+ throw new Error("نام متد API الزامی است.");
49
+ }
50
+ const timeoutMs = options.timeoutMs ?? this.timeoutMs;
51
+ const retries = Math.max(0, options.retries ?? this.retries);
52
+ let attempt = 0;
53
+ while (true) {
54
+ try {
55
+ return await this.execute(method, payload, options.signal, timeoutMs);
56
+ }
57
+ catch (error) {
58
+ const canRetry = attempt < retries && this.shouldRetry(error);
59
+ if (!canRetry)
60
+ throw error;
61
+ const delay = this.retryDelayMs * 2 ** attempt;
62
+ await sleep(delay);
63
+ attempt += 1;
64
+ }
65
+ }
66
+ }
67
+ async execute(method, payload, externalSignal, timeoutMs) {
68
+ const controller = new AbortController();
69
+ let timedOut = false;
70
+ const timeoutId = setTimeout(() => {
71
+ timedOut = true;
72
+ controller.abort();
73
+ }, timeoutMs);
74
+ const abortHandler = () => controller.abort();
75
+ externalSignal?.addEventListener("abort", abortHandler, { once: true });
76
+ try {
77
+ const response = await fetch(this.buildUrl(method), {
78
+ method: "POST",
79
+ headers: this.defaultHeaders,
80
+ body: JSON.stringify(payload),
81
+ signal: controller.signal,
82
+ });
83
+ const responseBody = await response.json().catch(() => ({}));
84
+ if (!response.ok) {
85
+ throw new RubikaHttpError(`Rubika HTTP Error: ${response.status}`, {
86
+ method,
87
+ statusCode: response.status,
88
+ statusText: response.statusText,
89
+ responseBody,
90
+ });
91
+ }
92
+ if (typeof responseBody === "object" && responseBody !== null) {
93
+ const bodyRecord = responseBody;
94
+ if (bodyRecord["status"] !== undefined &&
95
+ bodyRecord["status"] !== "OK" &&
96
+ bodyRecord["status"] !== 200) {
97
+ const message = String(bodyRecord["status_det"] ??
98
+ bodyRecord["description"] ??
99
+ "API Error");
100
+ throw new RubikaApiError(`[${method}] ${message}`, method, responseBody);
101
+ }
102
+ if ("data" in bodyRecord) {
103
+ return bodyRecord["data"];
104
+ }
105
+ }
106
+ return responseBody;
107
+ }
108
+ catch (error) {
109
+ if (timedOut)
110
+ throw new RubikaTimeoutError(method, timeoutMs);
111
+ if (error instanceof RubikaHttpError ||
112
+ error instanceof RubikaApiError ||
113
+ error instanceof RubikaTimeoutError) {
114
+ throw error;
115
+ }
116
+ if (error instanceof DOMException && error.name === "AbortError") {
117
+ throw new RubikaTimeoutError(method, timeoutMs);
118
+ }
119
+ throw error;
120
+ }
121
+ finally {
122
+ clearTimeout(timeoutId);
123
+ externalSignal?.removeEventListener("abort", abortHandler);
124
+ }
125
+ }
126
+ }
127
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/client/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAOxB,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,OAAO,SAAS;IACJ,KAAK,CAAS;IACd,OAAO,CAAS;IAEf,SAAS,CAAS;IAClB,cAAc,CAAyB;IACvC,OAAO,CAAS;IAChB,YAAY,CAAS;IAEtC,YAAY,KAAa,EAAE,OAAO,GAAwB,EAAE;QAC1D,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;QACzD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC;QAC/D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAC1B,CAAC,EACD,OAAO,CAAC,YAAY,IAAI,sBAAsB,CAC/C,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG;YACpB,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,YAAY,EAAE,0BAA0B;YACxC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC3B,CAAC;IACJ,CAAC;IAEO,QAAQ,CAAC,MAAc;QAC7B,OAAO,GAAG,IAAI,CAAC,OAAO,OAAO,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC;IACtD,CAAC;IAEO,WAAW,CAAC,KAAc;QAChC,IAAI,KAAK,YAAY,kBAAkB;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,OAAO,CACL,KAAK,CAAC,UAAU,KAAK,GAAG;gBACxB,KAAK,CAAC,UAAU,KAAK,GAAG;gBACxB,KAAK,CAAC,UAAU,KAAK,GAAG;gBACxB,KAAK,CAAC,UAAU,IAAI,GAAG,CACxB,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,YAAY,SAAS,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAc,EACd,OAAO,GAAe,EAAE,EACxB,OAAO,GAAmB,EAAE;QAE5B,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CACvB,MAAM,EACN,OAAO,EACP,OAAO,CAAC,MAAM,EACd,SAAS,CACV,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC9D,IAAI,CAAC,QAAQ;oBAAE,MAAM,KAAK,CAAC;gBAE3B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,OAAO,CAAC;gBAC/C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,OAAmB,EACnB,cAAuC,EACvC,SAAiB;QAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,QAAQ,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC9C,cAAc,EAAE,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAExE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBAClD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,cAAc;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAE7D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,eAAe,CAAC,sBAAsB,QAAQ,CAAC,MAAM,EAAE,EAAE;oBACjE,MAAM;oBACN,UAAU,EAAE,QAAQ,CAAC,MAAM;oBAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,YAAY;iBACb,CAAC,CAAC;YACL,CAAC;YAED,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC9D,MAAM,UAAU,GAAG,YAAuC,CAAC;gBAC3D,IACE,UAAU,CAAC,QAAQ,CAAC,KAAK,SAAS;oBAClC,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI;oBAC7B,UAAU,CAAC,QAAQ,CAAC,KAAK,GAAG,EAC5B,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,CACpB,UAAU,CAAC,YAAY,CAAC;wBACtB,UAAU,CAAC,aAAa,CAAC;wBACzB,WAAW,CACd,CAAC;oBACF,MAAM,IAAI,cAAc,CACtB,IAAI,MAAM,KAAK,OAAO,EAAE,EACxB,MAAM,EACN,YAAY,CACb,CAAC;gBACJ,CAAC;gBAED,IAAI,MAAM,IAAI,UAAU,EAAE,CAAC;oBACzB,OAAO,UAAU,CAAC,MAAM,CAAc,CAAC;gBACzC,CAAC;YACH,CAAC;YAED,OAAO,YAAyB,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,QAAQ;gBAAE,MAAM,IAAI,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC9D,IACE,KAAK,YAAY,eAAe;gBAChC,KAAK,YAAY,cAAc;gBAC/B,KAAK,YAAY,kBAAkB,EACnC,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACjE,MAAM,IAAI,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAClD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,cAAc,EAAE,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import { RubikaRequestErrorDetails, RubikaError } from "./types.js";
2
+ export declare class RubikaHttpError extends RubikaError {
3
+ readonly method: string;
4
+ readonly statusCode: number;
5
+ readonly statusText: string;
6
+ readonly responseBody: unknown;
7
+ constructor(message: string, details: RubikaRequestErrorDetails & {
8
+ statusCode: number;
9
+ statusText: string;
10
+ });
11
+ }
12
+ export declare class RubikaApiError extends RubikaError {
13
+ readonly method: string;
14
+ readonly response: unknown;
15
+ constructor(message: string, method: string, response: unknown);
16
+ }
17
+ export declare class RubikaTimeoutError extends RubikaError {
18
+ readonly method: string;
19
+ readonly timeoutMs: number;
20
+ constructor(method: string, timeoutMs: number);
21
+ }
22
+ //# sourceMappingURL=api-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-error.d.ts","sourceRoot":"","sources":["../../src/client/api-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGpE,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,YAAY,EAAE,OAAO,CAAC;IAEtC,YACE,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,yBAAyB,GAAG;QACnC,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,EAQF;CACF;AAED,qBAAa,cAAe,SAAQ,WAAW;IAC7C,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,QAAQ,EAAE,OAAO,CAAC;IAElC,YAAY,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAK7D;CACF;AAED,qBAAa,kBAAmB,SAAQ,WAAW;IACjD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,YAAY,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAK5C;CACF"}
@@ -0,0 +1,36 @@
1
+ import { RubikaError } from "./types.js";
2
+ export class RubikaHttpError extends RubikaError {
3
+ method;
4
+ statusCode;
5
+ statusText;
6
+ responseBody;
7
+ constructor(message, details) {
8
+ super(message);
9
+ this.name = "RubikaHttpError";
10
+ this.method = details.method;
11
+ this.statusCode = details.statusCode;
12
+ this.statusText = details.statusText;
13
+ this.responseBody = details.responseBody;
14
+ }
15
+ }
16
+ export class RubikaApiError extends RubikaError {
17
+ method;
18
+ response;
19
+ constructor(message, method, response) {
20
+ super(message);
21
+ this.name = "RubikaApiError";
22
+ this.method = method;
23
+ this.response = response;
24
+ }
25
+ }
26
+ export class RubikaTimeoutError extends RubikaError {
27
+ method;
28
+ timeoutMs;
29
+ constructor(method, timeoutMs) {
30
+ super(`Rubika API request "${method}" timed out after ${timeoutMs}ms`);
31
+ this.name = "RubikaTimeoutError";
32
+ this.method = method;
33
+ this.timeoutMs = timeoutMs;
34
+ }
35
+ }
36
+ //# sourceMappingURL=api-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-error.js","sourceRoot":"","sources":["../../src/client/api-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,WAAW,EAAE,MAAM,YAAY,CAAC;AAGpE,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC9B,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,UAAU,CAAS;IACnB,YAAY,CAAU;IAEtC,YACE,OAAe,EACf,OAGC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC7B,MAAM,CAAS;IACf,QAAQ,CAAU;IAElC,YAAY,OAAe,EAAE,MAAc,EAAE,QAAiB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACjC,MAAM,CAAS;IACf,SAAS,CAAS;IAElC,YAAY,MAAc,EAAE,SAAiB;QAC3C,KAAK,CAAC,uBAAuB,MAAM,qBAAqB,SAAS,IAAI,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ export type JsonPrimitive = string | number | boolean | null;
2
+ export type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
3
+ export interface JsonObject {
4
+ [key: string]: JsonValue;
5
+ }
6
+ export interface RubikaApiResponse<T = unknown> {
7
+ status?: string | number;
8
+ status_det?: string;
9
+ description?: string;
10
+ data?: T;
11
+ [key: string]: unknown;
12
+ }
13
+ export interface RubikaClientOptions {
14
+ baseUrl?: string;
15
+ timeoutMs?: number;
16
+ headers?: Record<string, string>;
17
+ retries?: number;
18
+ retryDelayMs?: number;
19
+ }
20
+ export interface RequestOptions {
21
+ signal?: AbortSignal;
22
+ timeoutMs?: number;
23
+ retries?: number;
24
+ }
25
+ export interface RubikaRequestErrorDetails {
26
+ method: string;
27
+ statusCode?: number;
28
+ statusText?: string;
29
+ responseBody?: unknown;
30
+ }
31
+ export declare class RubikaError extends Error {
32
+ constructor(message: string);
33
+ }
34
+ export interface RubikaRequestErrorDetails {
35
+ method: string;
36
+ statusCode?: number;
37
+ statusText?: string;
38
+ responseBody?: unknown;
39
+ }
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB"}
@@ -0,0 +1,7 @@
1
+ export class RubikaError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "RubikaError";
5
+ }
6
+ }
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAyCA,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ import type { BotClient, Chat } from "../index.js";
2
+ import type { ChatType, InlineKeyboard, ReplyKeyboard, Update } from "../index.js";
3
+ export interface ReplyOptions {
4
+ reply_to_message_id?: string;
5
+ inline_keyboard?: InlineKeyboard;
6
+ reply_keyboard?: ReplyKeyboard;
7
+ disable_notification?: boolean;
8
+ }
9
+ export declare class Context<S = any> {
10
+ readonly client: BotClient;
11
+ readonly update: Update;
12
+ readonly chatId: string;
13
+ readonly messageId?: string;
14
+ readonly replyToMessageId?: string;
15
+ readonly text?: string;
16
+ readonly senderId?: string;
17
+ readonly senderType?: ChatType;
18
+ readonly chatType?: ChatType | string;
19
+ readonly isMessage: boolean;
20
+ session: S;
21
+ constructor(client: BotClient, update: Update);
22
+ get isGroup(): boolean;
23
+ get isPrivate(): boolean;
24
+ reply(text: string, options?: ReplyOptions): Promise<unknown>;
25
+ replyToSender(text: string, options?: Omit<ReplyOptions, "reply_to_message_id">): Promise<unknown>;
26
+ deleteMessage(messageIds: string | string[]): Promise<void>;
27
+ edit(newText: string, inline_keyboard?: InlineKeyboard): Promise<unknown>;
28
+ getChat(): Promise<Chat>;
29
+ banChatMember(userId: string): Promise<unknown>;
30
+ }
31
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/context/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAc,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EAEd,aAAa,EACb,MAAM,EACP,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,YAAY;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,qBAAa,OAAO,CAAC,CAAC,GAAG,GAAG;IAC1B,SAAgB,MAAM,EAAE,SAAS,CAAC;IAClC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnC,SAAgB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1C,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClC,SAAgB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtC,SAAgB,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7C,SAAgB,SAAS,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAG,CAAC,CAAC;IAEnB,YAAY,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EA6B5C;IAED,IAAI,OAAO,IAAI,OAAO,CAKrB;IAED,IAAI,SAAS,IAAI,OAAO,CAKvB;IAEK,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,oBA+CnD;IAEK,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAM,oBAMxD;IAEK,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,iBAShD;IAEK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,cAAc,oBAgB3D;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAU7B;IAEK,aAAa,CAAC,MAAM,EAAE,MAAM,oBAajC;CACF"}