bonktools 3.2.0 → 4.1.2

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.
@@ -0,0 +1,459 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.RoomMaker = void 0;
40
+ const puppeteer_1 = __importDefault(require("puppeteer"));
41
+ const promises_1 = __importDefault(require("fs/promises"));
42
+ const path_1 = __importDefault(require("path"));
43
+ class RoomMaker {
44
+ constructor() {
45
+ this.injectorScript = '';
46
+ this.sgrApiScript = '';
47
+ }
48
+ async init() {
49
+ const projectRoot = path_1.default.join(__dirname, '..', '..');
50
+ try {
51
+ this.injectorScript = await promises_1.default.readFile(path_1.default.join(projectRoot, 'dependencies', 'CondensedInjector.js'), 'utf-8');
52
+ this.sgrApiScript = await promises_1.default.readFile(path_1.default.join(projectRoot, 'dependencies', 'sgrAPI.user.js'), 'utf-8');
53
+ console.log('[RoomMaker] ✅ Scripts loaded');
54
+ }
55
+ catch (error) {
56
+ console.error('[RoomMaker] ❌ Erro ao carregar scripts:');
57
+ console.error('Certifique-se de que os arquivos estão em dependencies/');
58
+ console.error('- CondensedInjector.js');
59
+ console.error('- sgrAPI.user.js');
60
+ throw error;
61
+ }
62
+ }
63
+ async createRoom(params) {
64
+ // Lido em runtime para respeitar .env já carregado (imports rodam antes do dotenv)
65
+ const useFirefox = process.env.BROWSER === 'firefox';
66
+ if (useFirefox) {
67
+ return this.createRoomWithPlaywright(params);
68
+ }
69
+ return this.createRoomWithPuppeteer(params);
70
+ }
71
+ async createRoomWithPuppeteer(params) {
72
+ console.log('[RoomMaker] 🚀 Starting room creation (Chromium)...');
73
+ if (this.lastRoomTime) {
74
+ const elapsed = Date.now() - this.lastRoomTime;
75
+ const waitTime = 5000 - elapsed;
76
+ if (waitTime > 0) {
77
+ console.log(`[RoomMaker] ⏳ Waiting ${waitTime}ms (rate limit)...`);
78
+ await new Promise(resolve => setTimeout(resolve, waitTime));
79
+ }
80
+ }
81
+ const browser = await this.launchBrowser();
82
+ const page = await browser.newPage();
83
+ page.setDefaultTimeout(30000);
84
+ try {
85
+ console.log('[RoomMaker] 📜 Registering scripts (evaluateOnNewDocument)...');
86
+ const injectorWithHeadCheck = '(function run(){ if(!document.head){ setTimeout(run,10); return; }\n' + this.injectorScript + '\n})();';
87
+ await page.evaluateOnNewDocument(injectorWithHeadCheck);
88
+ await page.evaluateOnNewDocument(this.sgrApiScript);
89
+ console.log('[RoomMaker] 🌐 Navigating to Bonk.io...');
90
+ page.goto('https://bonk.io/', { waitUntil: 'domcontentloaded' }).catch(() => { });
91
+ console.log('[RoomMaker] 🎮 Entering game frame...');
92
+ const frameHandle = await page.waitForSelector('#maingameframe', { timeout: 10000 });
93
+ const frame = await frameHandle.contentFrame();
94
+ if (!frame)
95
+ throw new Error('Game frame not found');
96
+ await this.login(frame);
97
+ await this.createGameRoom(frame, params);
98
+ const roomLink = await this.getRoomLink(frame);
99
+ await this.configureRoom(page, frame, params);
100
+ console.log(`[RoomMaker] ✅ Room created successfully: ${roomLink}`);
101
+ this.lastRoomTime = Date.now();
102
+ return { browser, page, roomLink, maps: params.maps };
103
+ }
104
+ catch (error) {
105
+ console.error('[RoomMaker] ❌ Error while creating room:', error);
106
+ await browser.close();
107
+ throw error;
108
+ }
109
+ }
110
+ async createRoomWithPlaywright(params) {
111
+ console.log('[RoomMaker] 🚀 Starting room creation (Firefox)...');
112
+ if (this.lastRoomTime) {
113
+ const elapsed = Date.now() - this.lastRoomTime;
114
+ const waitTime = 5000 - elapsed;
115
+ if (waitTime > 0) {
116
+ console.log(`[RoomMaker] ⏳ Waiting ${waitTime}ms (rate limit)...`);
117
+ await new Promise(resolve => setTimeout(resolve, waitTime));
118
+ }
119
+ }
120
+ const { firefox } = await Promise.resolve().then(() => __importStar(require('playwright')));
121
+ const headless = true;
122
+ const browser = await firefox.launch({
123
+ headless,
124
+ args: ['--window-size=1920,1080'],
125
+ });
126
+ // Chrome User-Agent to avoid infinite loading in Bonk.io (Firefox-only can fail)
127
+ const chromeUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36';
128
+ const context = await browser.newContext({
129
+ viewport: { width: 1920, height: 1080 },
130
+ ignoreHTTPSErrors: true,
131
+ userAgent: chromeUserAgent,
132
+ });
133
+ const page = await context.newPage();
134
+ page.setDefaultTimeout(30000);
135
+ try {
136
+ console.log('[RoomMaker] 📜 Registering scripts (addInitScript)...');
137
+ const injectorWithHeadCheck = '(function run(){ if(!document.head){ setTimeout(run,10); return; }\n' + this.injectorScript + '\n})();';
138
+ await page.addInitScript({ content: injectorWithHeadCheck });
139
+ await page.addInitScript({ content: this.sgrApiScript });
140
+ console.log('[RoomMaker] 🌐 Navigating to Bonk.io...');
141
+ await page.goto('https://bonk.io/', { waitUntil: 'load', timeout: 60000 }).catch(() => { });
142
+ console.log('[RoomMaker] 🎮 Entering game frame...');
143
+ await page.waitForSelector('#maingameframe', { timeout: 10000 });
144
+ const frameEl = await page.$('#maingameframe');
145
+ if (!frameEl)
146
+ throw new Error('Element #maingameframe not found');
147
+ const frame = await frameEl.contentFrame();
148
+ await frameEl.dispose();
149
+ if (!frame)
150
+ throw new Error('Game frame not found');
151
+ await this.login(frame);
152
+ await this.createGameRoom(frame, params);
153
+ const roomLink = await this.getRoomLink(frame);
154
+ await this.configureRoom(page, frame, params);
155
+ console.log(`[RoomMaker] ✅ Room created successfully: ${roomLink}`);
156
+ this.lastRoomTime = Date.now();
157
+ return { browser: browser, page: page, roomLink, maps: params.maps };
158
+ }
159
+ catch (error) {
160
+ console.error('[RoomMaker] ❌ Error while creating room:', error);
161
+ await browser.close();
162
+ throw error;
163
+ }
164
+ }
165
+ async launchBrowser() {
166
+ const headless = true;
167
+ console.log(`[RoomMaker] 🌐 Abrindo navegador (headless: ${headless})...`);
168
+ return await puppeteer_1.default.launch({
169
+ headless,
170
+ args: [
171
+ '--no-sandbox',
172
+ '--disable-setuid-sandbox',
173
+ '--disable-web-security',
174
+ '--disable-features=IsolateOrigins,site-per-process',
175
+ '--window-size=1920,1080'
176
+ ],
177
+ defaultViewport: null
178
+ });
179
+ }
180
+ async retry(operation, maxDurationMs = 10000, intervalMs = 250) {
181
+ const start = Date.now();
182
+ let lastError = null;
183
+ while (Date.now() - start < maxDurationMs) {
184
+ try {
185
+ return await operation();
186
+ }
187
+ catch (e) {
188
+ lastError = e instanceof Error ? e : new Error(String(e));
189
+ await new Promise(resolve => setTimeout(resolve, intervalMs));
190
+ }
191
+ }
192
+ throw lastError ?? new Error('Retry timeout');
193
+ }
194
+ async safeClick(frame, selector, waitMs = 500) {
195
+ const opts = { timeout: 10000, visible: true, state: 'visible' };
196
+ await frame.waitForSelector(selector, opts);
197
+ await new Promise(resolve => setTimeout(resolve, waitMs));
198
+ try {
199
+ await frame.click(selector);
200
+ }
201
+ catch {
202
+ await frame.evaluate((sel) => {
203
+ const el = document.querySelector(sel);
204
+ if (el)
205
+ el.click();
206
+ }, selector);
207
+ }
208
+ }
209
+ async login(frame) {
210
+ console.log('[RoomMaker] 🔐 Logging in...');
211
+ const username = process.env.BOT_USERNAME || 'FUTHERO BOT';
212
+ const password = process.env.BOT_PASSWORD;
213
+ if (!password) {
214
+ throw new Error('BOT_PASSWORD is not defined in .env');
215
+ }
216
+ await frame.waitForSelector('#guestOrAccountContainer_accountButton', { timeout: 10000 });
217
+ await this.retry(() => this.safeClick(frame, '#guestOrAccountContainer_accountButton', 250));
218
+ await frame.waitForSelector('#loginwindow_username', { timeout: 8000, visible: true });
219
+ await frame.evaluate((u, p) => {
220
+ document.getElementById('loginwindow_username').value = u;
221
+ document.getElementById('loginwindow_password').value = p;
222
+ }, username, password);
223
+ await frame.waitForSelector('#loginwindow_submitbutton', { timeout: 5000 });
224
+ let loggedIn = false;
225
+ const maxAttempts = 4;
226
+ for (let i = 0; i < maxAttempts; i++) {
227
+ await this.retry(() => this.safeClick(frame, '#loginwindow_submitbutton', 250));
228
+ try {
229
+ await frame.waitForSelector('#pretty_top_volume', { timeout: 5000, visible: true });
230
+ await this.retry(() => this.safeClick(frame, '#pretty_top_volume', 250));
231
+ loggedIn = true;
232
+ break;
233
+ }
234
+ catch { }
235
+ }
236
+ if (!loggedIn) {
237
+ throw new Error('Login failed - check BOT_USERNAME and BOT_PASSWORD in .env');
238
+ }
239
+ try {
240
+ await frame.waitForSelector('#pretty_top_volume_music', { timeout: 3000 });
241
+ await this.retry(() => this.safeClick(frame, '#pretty_top_volume_music', 250));
242
+ }
243
+ catch {
244
+ console.log('[RoomMaker] Music button not found (ignored, continuing...)');
245
+ }
246
+ console.log('[RoomMaker] ✅ Login successful');
247
+ }
248
+ async createGameRoom(frame, params) {
249
+ console.log('[RoomMaker] 🏗️ Creating room...');
250
+ await frame.waitForSelector('#classic_mid_customgame', { timeout: 5000 });
251
+ await this.retry(() => this.safeClick(frame, '#classic_mid_customgame', 250));
252
+ const roomInfo = {
253
+ roomName: params.name,
254
+ roomPass: params.password,
255
+ maxPlayers: params.maxPlayers,
256
+ minLevel: params.minLevel,
257
+ unlisted: params.unlisted,
258
+ };
259
+ let created = false;
260
+ const maxAttempts = 4;
261
+ for (let i = 0; i < maxAttempts; i++) {
262
+ await frame.waitForSelector('#roomlistcreatebutton', { timeout: 5000 });
263
+ await this.retry(() => this.safeClick(frame, '#roomlistcreatebutton', 250));
264
+ await frame.waitForSelector('#roomlistcreatewindowgamename', { timeout: 5000 });
265
+ await this.retry(() => this.safeClick(frame, '#roomlistcreatewindowgamename', 250));
266
+ await frame.evaluate((info) => {
267
+ document.getElementById('roomlistcreatewindowgamename').value = info.roomName;
268
+ document.getElementById('roomlistcreatewindowpassword').value = info.roomPass;
269
+ document.getElementById('roomlistcreatewindowmaxplayers').value = String(info.maxPlayers);
270
+ document.getElementById('roomlistcreatewindowminlevel').value = String(info.minLevel);
271
+ if (info.unlisted) {
272
+ document.getElementById('roomlistcreatewindowunlistedcheckbox').checked = true;
273
+ }
274
+ }, roomInfo);
275
+ await frame.waitForSelector('#roomlistcreatecreatebutton', { timeout: 5000 });
276
+ await this.retry(() => this.safeClick(frame, '#roomlistcreatecreatebutton', 250));
277
+ try {
278
+ await frame.waitForSelector('#newbonklobby_chatbox', { timeout: 10000 });
279
+ await this.retry(() => this.safeClick(frame, '#newbonklobby_chatbox', 250));
280
+ created = true;
281
+ break;
282
+ }
283
+ catch {
284
+ try {
285
+ await frame.waitForSelector('#sm_connectingWindowCancelButton', { timeout: 3000 });
286
+ await this.retry(() => this.safeClick(frame, '#sm_connectingWindowCancelButton', 250));
287
+ }
288
+ catch { }
289
+ }
290
+ }
291
+ if (!created) {
292
+ throw new Error('Room creation timeout.');
293
+ }
294
+ console.log('[RoomMaker] ✅ Room created in lobby');
295
+ }
296
+ async getRoomLink(frame) {
297
+ console.log('[RoomMaker] 🔗 Getting room link...');
298
+ await frame.waitForSelector('#newbonklobby_linkbutton', { timeout: 5000 });
299
+ await this.retry(() => this.safeClick(frame, '#newbonklobby_linkbutton', 250));
300
+ const roomLink = await this.retry(async () => {
301
+ const link = await frame.evaluate(() => {
302
+ const statusElements = document.querySelectorAll('.newbonklobby_chat_status');
303
+ if (statusElements.length === 0)
304
+ return '';
305
+ const lastStatus = statusElements[statusElements.length - 1];
306
+ const text = lastStatus.innerText || lastStatus.textContent || '';
307
+ const parts = text.split(' ');
308
+ return parts[parts.length - 1];
309
+ });
310
+ if (!link)
311
+ throw new Error('Link ainda não apareceu');
312
+ return link;
313
+ }, 10000, 250);
314
+ return roomLink;
315
+ }
316
+ async configureRoom(page, frame, params) {
317
+ console.log('[RoomMaker] ⚙️ Configuring room...');
318
+ const debugLog = process.env.BONK_DEBUG === '1' || process.env.BONK_DEBUG === 'true';
319
+ const maxWaitMs = 6000;
320
+ const pollIntervalMs = 400;
321
+ let hasEngine = false;
322
+ for (let waited = 0; waited < maxWaitMs; waited += pollIntervalMs) {
323
+ hasEngine = await frame.evaluate(() => {
324
+ const sgr = window.sgrAPI;
325
+ return typeof sgr !== 'undefined' && !!sgr.toolFunctions?.networkEngine;
326
+ });
327
+ if (hasEngine)
328
+ break;
329
+ await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
330
+ }
331
+ if (!hasEngine) {
332
+ console.warn('[RoomMaker] ⚠️ networkEngine did not appear after ' + maxWaitMs + 'ms. Chat and lock might not work.');
333
+ }
334
+ else if (debugLog) {
335
+ console.log('[RoomMaker:LOG] networkEngine available after wait');
336
+ }
337
+ await new Promise(resolve => setTimeout(resolve, 300));
338
+ try {
339
+ const configResult = await frame.evaluate((mode, teams) => {
340
+ const sgrAPI = window.sgrAPI;
341
+ if (typeof sgrAPI === 'undefined')
342
+ return { ok: false, reason: 'no_sgrAPI', chatHooks: false };
343
+ const hasEngine = !!sgrAPI.toolFunctions?.networkEngine;
344
+ if (hasEngine) {
345
+ sgrAPI.setMode(mode);
346
+ sgrAPI.toolFunctions.networkEngine.sendNoHostSwap();
347
+ sgrAPI.toolFunctions.networkEngine.doTeamLock(true);
348
+ if (teams)
349
+ sgrAPI.setTeams(true);
350
+ }
351
+ window.messageBuffer = [];
352
+ sgrAPI.onReceive = (message) => {
353
+ window.messageBuffer.push(message);
354
+ return true;
355
+ };
356
+ return {
357
+ ok: hasEngine,
358
+ reason: hasEngine ? null : 'no_networkEngine',
359
+ chatHooks: true,
360
+ hasPlayers: sgrAPI.players != null,
361
+ };
362
+ }, params.mode, params.teams ?? false);
363
+ if (debugLog) {
364
+ console.log('[RoomMaker:LOG] configureRoom execute:', configResult ?? '(undefined)');
365
+ }
366
+ if (configResult) {
367
+ const r = configResult;
368
+ if (!r.ok)
369
+ console.warn('[RoomMaker] ⚠️ networkEngine missing (host/lock not applied). Chat configured:', r.chatHooks);
370
+ if (!r.chatHooks)
371
+ console.warn('[RoomMaker] ⚠️ Chat not configured (sgrAPI missing?)');
372
+ }
373
+ }
374
+ catch (e) {
375
+ console.warn('[RoomMaker] configureRoom execution failed (sgrAPI/toolFunctions?):', e);
376
+ }
377
+ const roundsInput = await frame.waitForSelector('#newbonklobby_roundsinput', { timeout: 5000 }).catch(() => null);
378
+ if (roundsInput) {
379
+ await roundsInput.click();
380
+ await page.keyboard.down('Control');
381
+ await page.keyboard.press('a');
382
+ await page.keyboard.up('Control');
383
+ await page.keyboard.type(String(params.rounds), { delay: 60 });
384
+ await page.keyboard.press('Tab');
385
+ await roundsInput.dispose?.();
386
+ }
387
+ try {
388
+ await frame.evaluate(() => {
389
+ const sgr = window.sgrAPI;
390
+ if (sgr?.toolFunctions?.networkEngine?.changeOwnTeam) {
391
+ sgr.toolFunctions.networkEngine.changeOwnTeam(0);
392
+ }
393
+ });
394
+ console.log('[RoomMaker] 👁️ Bot set to spectator');
395
+ }
396
+ catch (_) { }
397
+ await new Promise(resolve => setTimeout(resolve, 500));
398
+ try {
399
+ // Carregar mapa: por posição nos favoritos (favoriteIndex) ou por JSON (params.maps) ou 1º favorito
400
+ const favIndex = params.favoriteIndex ?? -1;
401
+ const loadByFavoriteIndex = favIndex >= 0;
402
+ if (loadByFavoriteIndex) {
403
+ const favResult = await frame.evaluate(async (index) => {
404
+ const sgr = window.sgrAPI;
405
+ if (!sgr || typeof sgr.getFav !== 'function')
406
+ return { ok: false, reason: 'no_getFav' };
407
+ const offset = Math.floor(index / 32);
408
+ const subIndex = index % 32;
409
+ const res = await sgr.getFav(offset);
410
+ if (res && res.maps && res.maps[subIndex]) {
411
+ if (typeof sgr.loadMap === 'function')
412
+ sgr.loadMap(res.maps[subIndex]);
413
+ return { ok: true, mapId: res.maps[subIndex].id, name: res.maps[subIndex].name };
414
+ }
415
+ return { ok: false, reason: 'no_fav_at_index' };
416
+ }, favIndex);
417
+ if (favResult && favResult.ok) {
418
+ const name = favResult.name ?? '(favorito)';
419
+ console.log(`[RoomMaker] 🗺️ Map loaded: favorite index ${favIndex} (${name})`);
420
+ }
421
+ else {
422
+ console.warn(`[RoomMaker] ⚠️ No map at favorite index ${favIndex}`);
423
+ }
424
+ }
425
+ else if (params.maps && params.maps.length > 0) {
426
+ await frame.evaluate((mapJson) => {
427
+ const sgrAPI = window.sgrAPI;
428
+ if (typeof sgrAPI !== 'undefined' && typeof sgrAPI.loadMap === 'function') {
429
+ sgrAPI.loadMap(JSON.parse(mapJson));
430
+ }
431
+ }, params.maps[0]);
432
+ console.log('[RoomMaker] 🗺️ Mode map loaded (JSON config)');
433
+ }
434
+ else {
435
+ const favResult = await frame.evaluate(async () => {
436
+ const sgr = window.sgrAPI;
437
+ if (!sgr || typeof sgr.getFav !== 'function')
438
+ return { ok: false, reason: 'no_getFav' };
439
+ const res = await sgr.getFav(0);
440
+ if (res && res.maps && res.maps.length > 0) {
441
+ if (typeof sgr.loadMap === 'function')
442
+ sgr.loadMap(res.maps[0]);
443
+ return { ok: true, mapId: res.maps[0].id };
444
+ }
445
+ return { ok: false, reason: 'no_fav_maps' };
446
+ });
447
+ if (favResult && favResult.ok) {
448
+ console.log('[RoomMaker] 🗺️ Favorite map loaded (first in list)');
449
+ }
450
+ }
451
+ }
452
+ catch (e) {
453
+ if (debugLog)
454
+ console.log('[RoomMaker:LOG] getFav/loadMap:', e.message);
455
+ }
456
+ console.log('[RoomMaker] ✅ Room configured');
457
+ }
458
+ }
459
+ exports.RoomMaker = RoomMaker;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RATING_CONFIG = exports.TIMEOUTS = exports.ROOM_CONFIG = void 0;
4
+ exports.ROOM_CONFIG = {
5
+ name: process.env.ROOM_NAME || "🔥 FUTHERO | X2 | FUTSAL 🔥",
6
+ password: process.env.ROOM_PASSWORD ?? "",
7
+ maxPlayers: parseInt(process.env.ROOM_MAX_PLAYERS || "8"),
8
+ hidden: process.env.ROOM_HIDDEN === "true",
9
+ minLevel: parseInt(process.env.ROOM_MIN_LEVEL || "0"),
10
+ unlisted: process.env.ROOM_UNLISTED === "true",
11
+ };
12
+ exports.TIMEOUTS = {
13
+ IDLE_TIME: 30000, // 30 segundos sem jogadores suficientes
14
+ PICK_TIME: 60000, // 60 segundos para escolher adversário
15
+ READY_TIME: 60000, // 60 segundos para todos ficarem prontos
16
+ GAME_TIME: 600000, // 10 minutos de jogo máximo
17
+ };
18
+ exports.RATING_CONFIG = {
19
+ INITIAL_RATING: 1500,
20
+ K_FACTOR: 32,
21
+ MIN_RATING: 0,
22
+ MAX_RATING: 3000,
23
+ };
package/dist/index.js ADDED
@@ -0,0 +1,96 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const bot_1 = __importDefault(require("./bot"));
40
+ const fs_1 = require("fs");
41
+ const path_1 = __importDefault(require("path"));
42
+ const browserManager_1 = require("./browser/browserManager");
43
+ const eventsPath = path_1.default.join(__dirname, "events");
44
+ function listEventFiles(dir) {
45
+ const items = (0, fs_1.readdirSync)(dir);
46
+ const files = [];
47
+ for (const item of items) {
48
+ const full = path_1.default.join(dir, item);
49
+ const st = (0, fs_1.statSync)(full);
50
+ if (st.isDirectory()) {
51
+ files.push(...listEventFiles(full));
52
+ }
53
+ else if (st.isFile() && (full.endsWith(".js") || full.endsWith(".cjs") || full.endsWith(".mjs"))) {
54
+ files.push(full);
55
+ }
56
+ }
57
+ return files;
58
+ }
59
+ for (const file of listEventFiles(eventsPath)) {
60
+ Promise.resolve(`${file}`).then(s => __importStar(require(s))).then((module) => {
61
+ if (typeof module.default === "function") {
62
+ module.default(bot_1.default);
63
+ console.log(`🟢 Loaded event: ${path_1.default.relative(eventsPath, file)}`);
64
+ }
65
+ });
66
+ }
67
+ // Graceful shutdown - close browser when bot is terminated
68
+ process.on("SIGINT", async () => {
69
+ console.log("\n[Bot] Received SIGINT (Ctrl+C). Shutting down...");
70
+ try {
71
+ await browserManager_1.browserManager.close();
72
+ }
73
+ catch (error) {
74
+ console.error("[Bot] Error while closing browser:", error);
75
+ }
76
+ process.exit(0);
77
+ });
78
+ process.on("SIGTERM", async () => {
79
+ console.log("\n[Bot] Received SIGTERM. Shutting down...");
80
+ try {
81
+ await browserManager_1.browserManager.close();
82
+ }
83
+ catch (error) {
84
+ console.error("[Bot] Error while closing browser:", error);
85
+ }
86
+ process.exit(0);
87
+ });
88
+ (async () => {
89
+ try {
90
+ await bot_1.default.init();
91
+ console.log("✅ Bot initialized! Waiting for 'ready' event...");
92
+ }
93
+ catch (err) {
94
+ console.error("❌ Failed to initialize bot:", err);
95
+ }
96
+ })();
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LOG_LEVELS = exports.createBot = exports.RoomMaker = void 0;
4
+ exports.startRoom = startRoom;
5
+ const roomMaker_1 = require("../browser/roomMaker");
6
+ var roomMaker_2 = require("../browser/roomMaker");
7
+ Object.defineProperty(exports, "RoomMaker", { enumerable: true, get: function () { return roomMaker_2.RoomMaker; } });
8
+ var bonktools_1 = require("bonktools");
9
+ Object.defineProperty(exports, "createBot", { enumerable: true, get: function () { return bonktools_1.createBot; } });
10
+ Object.defineProperty(exports, "LOG_LEVELS", { enumerable: true, get: function () { return bonktools_1.LOG_LEVELS; } });
11
+ async function startRoom(params) {
12
+ const maker = new roomMaker_1.RoomMaker();
13
+ await maker.init();
14
+ return maker.createRoom(params);
15
+ }