Spaces:
Paused
Paused
Update bot.js
Browse files
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
|
| 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(
|
| 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 (
|
| 336 |
-
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 629 |
-
|
| 630 |
-
|
| 631 |
-
|
| 632 |
-
|
| 633 |
-
|
| 634 |
-
|
| 635 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 636 |
} else {
|
| 637 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 638 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 639 |
}
|
| 640 |
-
|
|
|
|
|
|
|
| 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 |
|