SlnDmry commited on
Commit
2708a72
·
verified ·
1 Parent(s): 8372605

Update bot.js

Browse files
Files changed (1) hide show
  1. bot.js +86 -29
bot.js CHANGED
@@ -18,8 +18,8 @@ const https = require('https');
18
  const HOME_ARRIVAL_DELAY_MS = 2000;
19
  const POST_ACTION_DELAY_MS = 4000;
20
  const WINDOW_OPEN_TIMEOUT_MS = 6000;
21
- const PERIODIC_CHECK_INTERVAL_MS = 10 * 60 * 1000;
22
- const FULL_FEED_COOLDOWN_MS = 50 * 60 * 1000;
23
  const GO_HOME_COMMAND = "/home";
24
  const RETURN_ISLAND_COMMAND = "/is home";
25
  const BESLEYICI_NAMES = (config.utils && config.utils["besleyici-names"]) || ["Besleyici", "ʙᴇsʟᴇʏiᴄi"];
@@ -46,12 +46,16 @@ let windowOpenResolvers = [];
46
  let botUptimeStart = null;
47
  let lastFullFeedTimeStr = "Henüz besleme yapılmadı";
48
  let lastCheckTimeStr = "Henüz kontrol yapılmadı";
 
49
 
50
  // --- DİNAMİK IP VE KONUM BİLGİLERİ ---
51
  let activeConnectionIp = "Bilinmiyor";
52
  let activeConnectionLocation = "Bilinmiyor";
53
  let localExternalIp = "Bilinmiyor";
54
 
 
 
 
55
  function getIpLocation(ip) {
56
  return new Promise((resolve) => {
57
  if (!ip || ip === "Bilinmiyor" || ip.startsWith("127.")) {
@@ -62,7 +66,7 @@ function getIpLocation(ip) {
62
  res.on('data', chunk => data += chunk);
63
  res.on('end', () => {
64
  try {
65
- const geo = JSON.parse(body || data);
66
  if (geo && geo.status === 'success') {
67
  resolve(`${geo.country} / ${geo.city}`);
68
  } else {
@@ -322,7 +326,6 @@ async function createBot() {
322
  bot.loadPlugin(pathfinder);
323
 
324
  let lastFullFeedAt = 0;
325
- let periodicHandle = null;
326
  let activeTimeouts = [];
327
 
328
  function setSafeTimeout(fn, delay) {
@@ -332,8 +335,10 @@ async function createBot() {
332
  }
333
 
334
  function stopPeriodicHomeChecks() {
335
- if (periodicHandle) clearInterval(periodicHandle);
336
- periodicHandle = null;
 
 
337
  activeTimeouts.forEach(t => clearTimeout(t));
338
  activeTimeouts = [];
339
  }
@@ -345,6 +350,11 @@ async function createBot() {
345
  return `${dateStr} - ${timeStr}`;
346
  }
347
 
 
 
 
 
 
348
  function stripColorCodes(s) {
349
  if (!s || typeof s !== "string") return s;
350
  return s.replace(/§[0-9a-fk-or]/gi, "");
@@ -475,9 +485,35 @@ async function createBot() {
475
  bot.chat(RETURN_ISLAND_COMMAND);
476
  }
477
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
478
  async function scanAndFeed() {
479
  if (!bot || !botIsReady) return;
480
- if (Date.now() < (lastFullFeedAt + FULL_FEED_COOLDOWN_MS)) return;
 
 
 
 
 
 
481
  const arr = Object.values(bot.entities);
482
  let best = null;
483
 
@@ -500,6 +536,8 @@ async function createBot() {
500
  if (!best) {
501
  logger.info(`[${currentBotUsername}] /home sonrası tarama: besleyici minyon bulunamadı.`);
502
  bot.chat("/skyblock");
 
 
503
  return;
504
  }
505
 
@@ -509,6 +547,7 @@ async function createBot() {
509
  if (dist > 7) {
510
  logger.warn(`safeActivateEntityPreferAt: entity id:${best.entity.id} uzak (${dist.toFixed(2)}). Max 7 blok.`);
511
  logger.warn(`[${currentBotUsername}] 'Besleyici' aktive edilemedi (id:${best.entity.id}).`);
 
512
  return;
513
  }
514
 
@@ -544,6 +583,7 @@ async function createBot() {
544
  if (Date.now() > endTime) {
545
  logger.warn(`[Tıklama Sistemi] ${WINDOW_OPEN_TIMEOUT_MS} ms doldu ancak menü sunucudan gelmedi. Pes ediliyor.`);
546
  cleanFinish();
 
547
  return;
548
  }
549
 
@@ -588,6 +628,7 @@ async function createBot() {
588
  }
589
  }, 7500);
590
 
 
591
  setSafeTimeout(async () => {
592
  if (!bot || !botIsReady) return;
593
  await goHome();
@@ -595,21 +636,11 @@ async function createBot() {
595
  await scanAndFeed();
596
  await new Promise(r => setTimeout(r, POST_ACTION_DELAY_MS));
597
  await returnIsland();
598
-
599
- periodicHandle = setInterval(async () => {
600
- if (!bot || !botIsReady) return;
601
- if (Date.now() < (lastFullFeedAt + FULL_FEED_COOLDOWN_MS)) return;
602
- await goHome();
603
- await new Promise(r => setTimeout(r, HOME_ARRIVAL_DELAY_MS));
604
- await scanAndFeed();
605
- await new Promise(r => setTimeout(r, POST_ACTION_DELAY_MS));
606
- await returnIsland();
607
- }, PERIODIC_CHECK_INTERVAL_MS);
608
  }, 12500);
609
  }
610
  });
611
 
612
- bot.on("windowOpen", (window) => {
613
  if (!bot) return;
614
  const title = parseWindowTitleToString(window.title).toLowerCase();
615
  if (!title.includes("besleyici") && !parseWindowTitleToString(window.title).includes("ʙᴇsʟᴇʏiᴄi")) {
@@ -625,19 +656,43 @@ async function createBot() {
625
  lastCheckTimeStr = `${currentStamp} (Okunan Can: ${can})`;
626
 
627
  if (can <= 2) {
628
- try { bot.clickWindow(36, 0, 0); } catch(e){}
629
- lastFullFeedAt = Date.now();
630
- lastFullFeedTimeStr = `${currentStamp} (Minyon canı ${can} iken başarıyla beslendi)`;
631
- logger.info(`[${currentBotUsername}] Minyon canı ${can} olduğu için beslendi. 50dk bekleme aktif.`);
632
- } else if (can >= 10) {
633
- lastFullFeedAt = Date.now();
634
- lastFullFeedTimeStr = `${currentStamp} (Canı ${can} olduğu için besleme gerekmedi)`;
635
- logger.info(`[${currentBotUsername}] Minyon canı ${can} (tam). 50dk bekleme aktif.`);
 
 
 
 
636
  } else {
637
- logger.info(`[${currentBotUsername}] Minyon canı ${can} olduğu için yenilenmedi.`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
638
  }
 
 
 
 
639
  }
640
- setSafeTimeout(() => { if (bot) { try { bot.closeWindow(window); } catch(e){} } }, 500);
 
 
641
  while (windowOpenResolvers.length > 0) {
642
  const fn = windowOpenResolvers.shift();
643
  if (typeof fn === 'function') fn();
@@ -653,6 +708,7 @@ async function createBot() {
653
  isListeningChat = false;
654
  activeConnectionIp = "Bilinmiyor";
655
  activeConnectionLocation = "Bilinmiyor";
 
656
 
657
  safeDestroyAllConnections();
658
 
@@ -769,7 +825,8 @@ app.get("/status", (req, res) => {
769
  connection_geo: activeConnectionLocation,
770
  bot_uptime: uptimeString,
771
  last_minyon_check: lastCheckTimeStr,
772
- last_minyon_feed: lastFullFeedTimeStr
 
773
  });
774
  });
775
 
 
18
  const HOME_ARRIVAL_DELAY_MS = 2000;
19
  const POST_ACTION_DELAY_MS = 4000;
20
  const WINDOW_OPEN_TIMEOUT_MS = 6000;
21
+ const DEFAULT_CHECK_INTERVAL_MS = 10 * 60 * 1000; // Varsayılan 10 dk
22
+ const FULL_FEED_COOLDOWN_MS = 50 * 60 * 1000; // Besleme sonrası sabit 50 dk
23
  const GO_HOME_COMMAND = "/home";
24
  const RETURN_ISLAND_COMMAND = "/is home";
25
  const BESLEYICI_NAMES = (config.utils && config.utils["besleyici-names"]) || ["Besleyici", "ʙᴇsʟᴇʏiᴄi"];
 
46
  let botUptimeStart = null;
47
  let lastFullFeedTimeStr = "Henüz besleme yapılmadı";
48
  let lastCheckTimeStr = "Henüz kontrol yapılmadı";
49
+ let nextScheduledCheckTimeStr = "Botun spawn olması bekleniyor...";
50
 
51
  // --- DİNAMİK IP VE KONUM BİLGİLERİ ---
52
  let activeConnectionIp = "Bilinmiyor";
53
  let activeConnectionLocation = "Bilinmiyor";
54
  let localExternalIp = "Bilinmiyor";
55
 
56
+ // --- DİNAMİK ZAMANLAYICI KONTROLÜ ---
57
+ let periodicTimeoutHandle = null;
58
+
59
  function getIpLocation(ip) {
60
  return new Promise((resolve) => {
61
  if (!ip || ip === "Bilinmiyor" || ip.startsWith("127.")) {
 
66
  res.on('data', chunk => data += chunk);
67
  res.on('end', () => {
68
  try {
69
+ const geo = JSON.parse(data);
70
  if (geo && geo.status === 'success') {
71
  resolve(`${geo.country} / ${geo.city}`);
72
  } else {
 
326
  bot.loadPlugin(pathfinder);
327
 
328
  let lastFullFeedAt = 0;
 
329
  let activeTimeouts = [];
330
 
331
  function setSafeTimeout(fn, delay) {
 
335
  }
336
 
337
  function stopPeriodicHomeChecks() {
338
+ if (periodicTimeoutHandle) {
339
+ clearTimeout(periodicTimeoutHandle);
340
+ periodicTimeoutHandle = null;
341
+ }
342
  activeTimeouts.forEach(t => clearTimeout(t));
343
  activeTimeouts = [];
344
  }
 
350
  return `${dateStr} - ${timeStr}`;
351
  }
352
 
353
+ function getFutureDateTimeString(delayMs) {
354
+ const future = new Date(Date.now() + delayMs);
355
+ return future.toLocaleTimeString('tr-TR');
356
+ }
357
+
358
  function stripColorCodes(s) {
359
  if (!s || typeof s !== "string") return s;
360
  return s.replace(/§[0-9a-fk-or]/gi, "");
 
485
  bot.chat(RETURN_ISLAND_COMMAND);
486
  }
487
 
488
+ // --- DİNAMİK PLANLAMA MOTORU ---
489
+ function scheduleNextCheck(delayMs) {
490
+ if (periodicTimeoutHandle) {
491
+ clearTimeout(periodicTimeoutHandle);
492
+ }
493
+
494
+ nextScheduledCheckTimeStr = `${getFutureDateTimeString(delayMs)} (${Math.round(delayMs / 60 / 1000)} dk sonra)`;
495
+ logger.info(`[Planlayıcı] Bir sonraki döngü planlandı. Zaman: ${nextScheduledCheckTimeStr}`);
496
+
497
+ periodicTimeoutHandle = setTimeout(async () => {
498
+ if (!bot || !botIsReady) return;
499
+
500
+ await goHome();
501
+ await new Promise(r => setTimeout(r, HOME_ARRIVAL_DELAY_MS));
502
+ await scanAndFeed();
503
+ await new Promise(r => setTimeout(r, POST_ACTION_DELAY_MS));
504
+ await returnIsland();
505
+ }, delayMs);
506
+ }
507
+
508
  async function scanAndFeed() {
509
  if (!bot || !botIsReady) return;
510
+
511
+ // Sunucu lagı yüzünden döngü üst üste tetiklenirse koruma
512
+ if (Date.now() < (lastFullFeedAt + 30000)) {
513
+ logger.warn("[Planlayıcı] Çok kısa süre önce işlem yapıldı. Güvenlik kilidi devrede.");
514
+ return;
515
+ }
516
+
517
  const arr = Object.values(bot.entities);
518
  let best = null;
519
 
 
536
  if (!best) {
537
  logger.info(`[${currentBotUsername}] /home sonrası tarama: besleyici minyon bulunamadı.`);
538
  bot.chat("/skyblock");
539
+ // Okuyamadığımız için 10 dakika sonra tekrar deneyecek şekilde planla
540
+ scheduleNextCheck(DEFAULT_CHECK_INTERVAL_MS);
541
  return;
542
  }
543
 
 
547
  if (dist > 7) {
548
  logger.warn(`safeActivateEntityPreferAt: entity id:${best.entity.id} uzak (${dist.toFixed(2)}). Max 7 blok.`);
549
  logger.warn(`[${currentBotUsername}] 'Besleyici' aktive edilemedi (id:${best.entity.id}).`);
550
+ scheduleNextCheck(DEFAULT_CHECK_INTERVAL_MS);
551
  return;
552
  }
553
 
 
583
  if (Date.now() > endTime) {
584
  logger.warn(`[Tıklama Sistemi] ${WINDOW_OPEN_TIMEOUT_MS} ms doldu ancak menü sunucudan gelmedi. Pes ediliyor.`);
585
  cleanFinish();
586
+ scheduleNextCheck(DEFAULT_CHECK_INTERVAL_MS);
587
  return;
588
  }
589
 
 
628
  }
629
  }, 7500);
630
 
631
+ // İlk çalıştırma: Girişten 12.5 saniye sonra ilk kontrolü yap
632
  setSafeTimeout(async () => {
633
  if (!bot || !botIsReady) return;
634
  await goHome();
 
636
  await scanAndFeed();
637
  await new Promise(r => setTimeout(r, POST_ACTION_DELAY_MS));
638
  await returnIsland();
 
 
 
 
 
 
 
 
 
 
639
  }, 12500);
640
  }
641
  });
642
 
643
+ bot.on("windowOpen", async (window) => {
644
  if (!bot) return;
645
  const title = parseWindowTitleToString(window.title).toLowerCase();
646
  if (!title.includes("besleyici") && !parseWindowTitleToString(window.title).includes("ʙᴇsʟᴇʏiᴄi")) {
 
656
  lastCheckTimeStr = `${currentStamp} (Okunan Can: ${can})`;
657
 
658
  if (can <= 2) {
659
+ // CAN 2 VEYA ALTINDA: BESLE VE SABİT 50 DK PLANLA
660
+ try {
661
+ logger.info(`[${currentBotUsername}] Minyon canı ${can} olduğu için besleniyor...`);
662
+ await bot.clickWindow(36, 0, 0);
663
+ lastFullFeedAt = Date.now();
664
+ lastFullFeedTimeStr = `${currentStamp} (Minyon canı ${can} iken başarıyla beslendi)`;
665
+ logger.info(`[${currentBotUsername}] Tıklama onaylandı. Fixed 50dk bekleme aktif.`);
666
+ } catch(e) {
667
+ logger.error(`[Arayüz Hatası] Tıklama işlemi sunucu tarafından onaylanmadı: ${e.message}`);
668
+ }
669
+ scheduleNextCheck(FULL_FEED_COOLDOWN_MS);
670
+
671
  } else {
672
+ // CAN 3 VEYA DAHA YÜKSEK: DİNAMİK PLANLAMA YAP
673
+ // Formül: (Can - 2) * 5 dakika. Maksimum 50 dakika.
674
+ let calculatedMinutes = (can - 2) * 5;
675
+ if (calculatedMinutes > 50) calculatedMinutes = 50;
676
+ if (calculatedMinutes < 10) calculatedMinutes = 10;
677
+
678
+ const dynamicDelayMs = calculatedMinutes * 60 * 1000;
679
+
680
+ logger.info(`[${currentBotUsername}] Minyon canı ${can} olarak okundu. Canın 2'ye düşmesi için ${calculatedMinutes} dakika beklenecek.`);
681
+
682
+ if (can >= 10) {
683
+ lastFullFeedTimeStr = `${currentStamp} (Canı ${can} olduğu için besleme gerekmedi)`;
684
+ }
685
+
686
+ scheduleNextCheck(dynamicDelayMs);
687
  }
688
+ } else {
689
+ // Can okunamadıysa güvenlik amacıyla 10 dk sonra tekrar kontrol et
690
+ logger.warn(`[${currentBotUsername}] Menü açıldı ama can okunamadı. 10 dk sonra tekrar denenecek.`);
691
+ scheduleNextCheck(DEFAULT_CHECK_INTERVAL_MS);
692
  }
693
+
694
+ try { bot.closeWindow(window); } catch(e){}
695
+
696
  while (windowOpenResolvers.length > 0) {
697
  const fn = windowOpenResolvers.shift();
698
  if (typeof fn === 'function') fn();
 
708
  isListeningChat = false;
709
  activeConnectionIp = "Bilinmiyor";
710
  activeConnectionLocation = "Bilinmiyor";
711
+ nextScheduledCheckTimeStr = "Bağlantı koptuğu için planlama iptal edildi.";
712
 
713
  safeDestroyAllConnections();
714
 
 
825
  connection_geo: activeConnectionLocation,
826
  bot_uptime: uptimeString,
827
  last_minyon_check: lastCheckTimeStr,
828
+ last_minyon_feed: lastFullFeedTimeStr,
829
+ next_scheduled_check: nextScheduledCheckTimeStr // Panel için sonraki kontrol saati
830
  });
831
  });
832