Suvarii commited on
Commit
4655574
·
verified ·
1 Parent(s): 7601b66

Update bot.js

Browse files
Files changed (1) hide show
  1. bot.js +85 -61
bot.js CHANGED
@@ -174,22 +174,21 @@ function createBot() {
174
  name: getEntityReadableName(e),
175
  pos: e.position ? { x: Number(e.position.x.toFixed(2)), y: Number(e.position.y.toFixed(2)), z: Number(e.position.z.toFixed(2)) } : null
176
  }));
177
- // Sadece tek satır JSON; istersen tamamen kapatabilirsin
178
  logger.info("/home sonrası kısa entity listesi: " + JSON.stringify(minimal));
179
  } catch (e) {
180
  // sessizce geç
181
  }
182
  }
183
 
184
- // Güvenli activate (lookAt, retry, mesafe kontrolü)
185
- async function safeActivateEntity(entity, options = {}) {
186
  const maxRetries = options.maxRetries ?? 3;
187
  const retryDelay = options.retryDelay ?? 250;
188
  const requireLook = options.requireLook ?? true;
189
  const maxDistance = options.maxDistance ?? 7;
190
 
191
  if (!entity) {
192
- logger.warn("safeActivateEntity: entity yok");
193
  return false;
194
  }
195
 
@@ -197,7 +196,7 @@ function createBot() {
197
  if (entity.position && bot.entity && bot.entity.position) {
198
  const dist = entity.position.distanceTo(bot.entity.position);
199
  if (dist > maxDistance) {
200
- logger.warn(`safeActivateEntity: entity id:${entity.id} uzak (${dist.toFixed(2)}). Max ${maxDistance} blok.`);
201
  return false;
202
  }
203
  }
@@ -215,39 +214,48 @@ function createBot() {
215
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
216
  try {
217
  if (typeof bot.activateEntityAt === "function") {
218
- bot.activateEntityAt(entity, entity.position);
219
- logger.info(`safeActivateEntity: activateEntityAt çağrıldı id:${entity.id} attempt:${attempt}`);
220
- return true;
 
 
 
 
 
 
221
  }
222
 
223
  if (typeof bot.activateEntity === "function") {
224
- bot.activateEntity(entity);
225
- logger.info(`safeActivateEntity: activateEntity çağrıldı id:${entity.id} attempt:${attempt}`);
226
- return true;
 
 
 
 
227
  }
228
 
229
- logger.warn("safeActivateEntity: bot.activateEntityAt/activateEntity bulunamadı.");
 
230
  return false;
231
  } catch (err) {
232
- logger.warn(`safeActivateEntity: deneme başarısız id:${entity.id} attempt:${attempt} err:${err && err.message ? err.message : err}`);
233
  await new Promise(r => setTimeout(r, retryDelay));
234
  }
235
  }
236
 
237
- logger.error(`safeActivateEntity: tüm denemeler başarısız id:${entity.id}`);
238
  return false;
239
  } catch (err) {
240
- logger.error(`safeActivateEntity hata: ${err && err.stack ? err.stack : err}`);
241
  return false;
242
  }
243
  }
244
 
245
  // --- windowOpen bekleyici mekanizması ---
246
- // windowOpen event'i geldiğinde bu resolver'lar çağrılacak
247
  let windowOpenResolvers = [];
248
  function waitForWindowOpenOrTimeout(timeoutMs) {
249
  return new Promise((resolve) => {
250
- // Eğer zaten bir window açıksa hemen resolve et (güvenlik)
251
  try {
252
  if (bot.currentWindow && bot.currentWindow.type) {
253
  resolve({ opened: true });
@@ -256,7 +264,6 @@ function createBot() {
256
  } catch (e) {}
257
 
258
  const timer = setTimeout(() => {
259
- // timeout: panel açılmadı
260
  const idx = windowOpenResolvers.indexOf(resolver);
261
  if (idx !== -1) windowOpenResolvers.splice(idx, 1);
262
  resolve({ opened: false, timedOut: true });
@@ -352,10 +359,11 @@ function createBot() {
352
 
353
  if (found) {
354
  const readable = getEntityReadableName(found);
355
- logger.info(`[${config["bot-account"]["username"]}] '${BESLEYICI_NAME_CONFIG}' bulundu id:${found.id} path:${foundPath} — aktive ediliyor.`);
 
356
 
357
- // 4) Activate et ve panel açılmasını bekle (veya timeout)
358
- const activated = await safeActivateEntity(found, { maxRetries: 4, retryDelay: 300, requireLook: true, maxDistance: 7 });
359
  if (!activated) {
360
  logger.warn(`[${config["bot-account"]["username"]}] '${BESLEYICI_NAME_CONFIG}' aktive edilemedi (id:${found.id}).`);
361
  } else {
@@ -496,7 +504,18 @@ function createBot() {
496
  }
497
  });
498
 
499
- // Güvenli windowOpen handler: window.title artık her tipte olabilir
 
 
 
 
 
 
 
 
 
 
 
500
  bot.on("windowOpen", function (window) {
501
  try {
502
  // window.title bazen ChatMessage veya obje olabilir; güvenli string'e çevir
@@ -509,58 +528,63 @@ function createBot() {
509
  titleStr = String(window.title || "");
510
  }
511
 
512
- // Panel başlığı kontrolü (güvenli includes)
513
- if (titleStr && titleStr.includes && titleStr.includes("ʙᴇsʟᴇʏiᴄi ᴍiɴʏᴏɴ ᴘᴀɴᴇʟi")) {
514
- const beefSlots = window.slots.filter(xx => xx?.name && xx?.name === "cooked_beef");
515
- if (beefSlots.length > 0) {
516
- const beefSlot = beefSlots[0];
517
- let minyoncani = 9999;
518
- try {
519
- const lore = beefSlot?.nbt?.value?.display?.value?.Lore?.value?.value[1];
520
- const loreText = lore ? (JSON.parse(lore)?.extra?.[0]?.text ?? lore?.toString?.() ?? "") : "";
521
- minyoncani = Number((loreText).split("/")[0]);
522
- if (Number.isNaN(minyoncani)) minyoncani = Number(String(loreText).replace(/\D/g, "")) || minyoncani;
523
- } catch (err) {
524
- logger.warn("Minyon canı okunurken hata: " + (err && err.message ? err.message : err));
525
- }
526
-
527
- if (minyoncani <= 2) {
528
- bot.clickWindow(36, 0, 0);
529
- logger.info(`[${config["bot-account"]["username"]}] Minyon canı ${minyoncani} olduğu için besleyici minyon beslendi.`);
530
- // Sunucuya mesaj atmak yerine logger.info ile kaydediyoruz
531
- logger.info(`Minyon canı ${minyoncani} olduğu için besleyici ile beslendi.`);
532
- bot.closeWindow(window);
533
- } else {
534
- logger.info(`[${config["bot-account"]["username"]}] Minyon canı ${minyoncani} olduğu için yenilenmedi.`);
535
- // Sunucuya mesaj atmak yerine logger.info ile kaydediyoruz
536
- logger.info(`Minyon canı ${minyoncani} olduğu için yenilenmedi.`);
537
- bot.closeWindow(window);
538
- }
539
- } else {
540
- try { bot.closeWindow(window); } catch (e) {}
541
- }
542
 
543
- // Panel işlendi: bekleyen resolver'ları çağır
 
 
 
544
  try {
545
  while (windowOpenResolvers.length > 0) {
546
  const r = windowOpenResolvers.shift();
547
  try { r(); } catch (e) {}
548
  }
549
  } catch (e) {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
550
  } else {
551
- // Başlık eşleşmiyorsa yine window'u kapat ve bekleyenleri temizle
552
  try { bot.closeWindow(window); } catch (e) {}
553
- try {
554
- while (windowOpenResolvers.length > 0) {
555
- const r = windowOpenResolvers.shift();
556
- try { r(); } catch (e) {}
557
- }
558
- } catch (e) {}
559
  }
 
 
 
 
 
 
 
 
560
  } catch (err) {
561
  logger.error("windowOpen işlenirken hata: " + (err && err.stack ? err.stack : err));
562
  try { bot.closeWindow(window); } catch (e) {}
563
- // Hata olsa bile bekleyenleri temizle
564
  try {
565
  while (windowOpenResolvers.length > 0) {
566
  const r = windowOpenResolvers.shift();
 
174
  name: getEntityReadableName(e),
175
  pos: e.position ? { x: Number(e.position.x.toFixed(2)), y: Number(e.position.y.toFixed(2)), z: Number(e.position.z.toFixed(2)) } : null
176
  }));
 
177
  logger.info("/home sonrası kısa entity listesi: " + JSON.stringify(minimal));
178
  } catch (e) {
179
  // sessizce geç
180
  }
181
  }
182
 
183
+ // --- Güvenli activate (öncelikle activateEntityAt kullanır, retry ve lookAt içerir) ---
184
+ async function safeActivateEntityPreferAt(entity, options = {}) {
185
  const maxRetries = options.maxRetries ?? 3;
186
  const retryDelay = options.retryDelay ?? 250;
187
  const requireLook = options.requireLook ?? true;
188
  const maxDistance = options.maxDistance ?? 7;
189
 
190
  if (!entity) {
191
+ logger.warn("safeActivateEntityPreferAt: entity yok");
192
  return false;
193
  }
194
 
 
196
  if (entity.position && bot.entity && bot.entity.position) {
197
  const dist = entity.position.distanceTo(bot.entity.position);
198
  if (dist > maxDistance) {
199
+ logger.warn(`safeActivateEntityPreferAt: entity id:${entity.id} uzak (${dist.toFixed(2)}). Max ${maxDistance} blok.`);
200
  return false;
201
  }
202
  }
 
214
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
215
  try {
216
  if (typeof bot.activateEntityAt === "function") {
217
+ // activateEntityAt öncelikli
218
+ try {
219
+ bot.activateEntityAt(entity, entity.position);
220
+ logger.info(`safeActivateEntityPreferAt: activateEntityAt çağrıldı id:${entity.id} attempt:${attempt}`);
221
+ return true;
222
+ } catch (err) {
223
+ logger.warn(`safeActivateEntityPreferAt: activateEntityAt hata id:${entity.id} attempt:${attempt} err:${err && err.message ? err.message : err}`);
224
+ // denemeye devam
225
+ }
226
  }
227
 
228
  if (typeof bot.activateEntity === "function") {
229
+ try {
230
+ bot.activateEntity(entity);
231
+ logger.info(`safeActivateEntityPreferAt: activateEntity çağrıldı id:${entity.id} attempt:${attempt}`);
232
+ return true;
233
+ } catch (err) {
234
+ logger.warn(`safeActivateEntityPreferAt: activateEntity hata id:${entity.id} attempt:${attempt} err:${err && err.message ? err.message : err}`);
235
+ }
236
  }
237
 
238
+ // Eğer ikisi de yoksa hata ver
239
+ logger.warn("safeActivateEntityPreferAt: bot.activateEntityAt/activateEntity bulunamadı.");
240
  return false;
241
  } catch (err) {
242
+ logger.warn(`safeActivateEntityPreferAt: deneme başarısız id:${entity.id} attempt:${attempt} err:${err && err.message ? err.message : err}`);
243
  await new Promise(r => setTimeout(r, retryDelay));
244
  }
245
  }
246
 
247
+ logger.error(`safeActivateEntityPreferAt: tüm denemeler başarısız id:${entity.id}`);
248
  return false;
249
  } catch (err) {
250
+ logger.error(`safeActivateEntityPreferAt hata: ${err && err.stack ? err.stack : err}`);
251
  return false;
252
  }
253
  }
254
 
255
  // --- windowOpen bekleyici mekanizması ---
 
256
  let windowOpenResolvers = [];
257
  function waitForWindowOpenOrTimeout(timeoutMs) {
258
  return new Promise((resolve) => {
 
259
  try {
260
  if (bot.currentWindow && bot.currentWindow.type) {
261
  resolve({ opened: true });
 
264
  } catch (e) {}
265
 
266
  const timer = setTimeout(() => {
 
267
  const idx = windowOpenResolvers.indexOf(resolver);
268
  if (idx !== -1) windowOpenResolvers.splice(idx, 1);
269
  resolve({ opened: false, timedOut: true });
 
359
 
360
  if (found) {
361
  const readable = getEntityReadableName(found);
362
+ const dist = (found.position && bot.entity && bot.entity.position) ? found.position.distanceTo(bot.entity.position).toFixed(2) : "n/a";
363
+ logger.info(`[${config["bot-account"]["username"]}] '${BESLEYICI_NAME_CONFIG}' bulundu id:${found.id} path:${foundPath} dist:${dist} — aktive ediliyor.`);
364
 
365
+ // 4) Güvenli şekilde activate et (activateEntityAt öncelikli) ve panel açılmasını bekle (veya timeout)
366
+ const activated = await safeActivateEntityPreferAt(found, { maxRetries: 4, retryDelay: 300, requireLook: true, maxDistance: 7 });
367
  if (!activated) {
368
  logger.warn(`[${config["bot-account"]["username"]}] '${BESLEYICI_NAME_CONFIG}' aktive edilemedi (id:${found.id}).`);
369
  } else {
 
504
  }
505
  });
506
 
507
+ // windowClose listener: panel kapandığında bekleyenleri çözer
508
+ bot.on("windowClose", (window) => {
509
+ try {
510
+ // temizle ve resolver'ları çağır
511
+ while (windowOpenResolvers.length > 0) {
512
+ const r = windowOpenResolvers.shift();
513
+ try { r(); } catch (e) {}
514
+ }
515
+ } catch (e) {}
516
+ });
517
+
518
+ // Güvenli windowOpen handler: başlık, slot ve lore debug logları ekli
519
  bot.on("windowOpen", function (window) {
520
  try {
521
  // window.title bazen ChatMessage veya obje olabilir; güvenli string'e çevir
 
528
  titleStr = String(window.title || "");
529
  }
530
 
531
+ logger.info(`[${config["bot-account"]["username"]}] windowOpen başlığı: ${titleStr}`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
532
 
533
+ // Panel başlığı kontrolü (esnek)
534
+ const panelMatch = (titleStr && (titleStr.toLowerCase().includes("besleyici") || titleStr.includes("ʙᴇsʟᴇʏiᴄi")));
535
+ if (!panelMatch) {
536
+ try { bot.closeWindow(window); } catch (e) {}
537
  try {
538
  while (windowOpenResolvers.length > 0) {
539
  const r = windowOpenResolvers.shift();
540
  try { r(); } catch (e) {}
541
  }
542
  } catch (e) {}
543
+ return;
544
+ }
545
+
546
+ const beefSlots = window.slots.filter(xx => xx?.name && xx?.name === "cooked_beef");
547
+ logger.info(`[${config["bot-account"]["username"]}] windowOpen: beefSlots.length=${beefSlots.length}`);
548
+
549
+ if (beefSlots.length > 0) {
550
+ const beefSlot = beefSlots[0];
551
+ let minyoncani = 9999;
552
+ let loreText = "";
553
+ try {
554
+ const lore = beefSlot?.nbt?.value?.display?.value?.Lore?.value?.value[1];
555
+ loreText = lore ? (JSON.parse(lore)?.extra?.[0]?.text ?? lore?.toString?.() ?? "") : "";
556
+ minyoncani = Number((loreText).split("/")[0]);
557
+ if (Number.isNaN(minyoncani)) minyoncani = Number(String(loreText).replace(/\D/g, "")) || minyoncani;
558
+ } catch (err) {
559
+ logger.warn("Minyon canı okunurken hata: " + (err && err.message ? err.message : err));
560
+ }
561
+
562
+ logger.info(`[${config["bot-account"]["username"]}] windowOpen loreText: ${loreText}`);
563
+
564
+ if (minyoncani <= 2) {
565
+ bot.clickWindow(36, 0, 0);
566
+ logger.info(`[${config["bot-account"]["username"]}] Minyon canı ${minyoncani} olduğu için besleyici minyon beslendi.`);
567
+ logger.info(`Minyon canı ${minyoncani} olduğu için besleyici ile beslendi.`);
568
+ bot.closeWindow(window);
569
+ } else {
570
+ logger.info(`[${config["bot-account"]["username"]}] Minyon canı ${minyoncani} olduğu için yenilenmedi.`);
571
+ logger.info(`Minyon canı ${minyoncani} olduğu için yenilenmedi.`);
572
+ bot.closeWindow(window);
573
+ }
574
  } else {
 
575
  try { bot.closeWindow(window); } catch (e) {}
 
 
 
 
 
 
576
  }
577
+
578
+ // Panel işlendi: bekleyen resolver'ları çağır
579
+ try {
580
+ while (windowOpenResolvers.length > 0) {
581
+ const r = windowOpenResolvers.shift();
582
+ try { r(); } catch (e) {}
583
+ }
584
+ } catch (e) {}
585
  } catch (err) {
586
  logger.error("windowOpen işlenirken hata: " + (err && err.stack ? err.stack : err));
587
  try { bot.closeWindow(window); } catch (e) {}
 
588
  try {
589
  while (windowOpenResolvers.length > 0) {
590
  const r = windowOpenResolvers.shift();