Загрузка данных


const mineflayer = require('mineflayer');
const fs = require('fs');
const { exit } = require('process');
const bot = mineflayer.createBot({
    host: 'mc.funtime.su',
    version: '1.16.5',
    username: 'ficherlip14',
    hideErrors: true
});
let currentIndex = 0;
let loop = 0;
let isParsing = false

function generateAnarchyValues(start, end, prefix = 'an') {
    const anarchyValues = [];
    for (let i = start; i <= end; i++) {
        anarchyValues.push(`${prefix}${i}`);
    }
    return anarchyValues.map(value => parseInt(value.replace(prefix, '')));
}

const allowedAnarchyValues = [
    ...generateAnarchyValues(102, 108),
    ...generateAnarchyValues(203, 227),
    ...generateAnarchyValues(302, 316),
    ...generateAnarchyValues(502, 509),
    ...generateAnarchyValues(602, 605),
];

function loadExistingData() {
  try {
      const data = fs.readFileSync('output.json', 'utf8');
      return JSON.parse(data);
  } catch (error) {
      console.error('Ошибка при загрузке данных:', error);
      return { dump: { Принц: [], Титан: [],  Герцог: [], Князь: [] } };
  }
}
function loadExistingDataOther() {
  try {
      const data = fs.readFileSync('output_other.json', 'utf8');
      return JSON.parse(data);
  } catch (error) {
      console.error('Ошибка при загрузке данных:', error);
      return { dump: { Барон: [], Страж: [], Герой: [], Аспид: [], Сквид: [], Глава: [], Элита: [] } }; // Возвращаем пустую структуру в случае ошибки
  }
}
bot.on('spawn', () => {
  if (isParsing) return; // If parsing is already in progress, exit
  isParsing = true;
  let niks = [];
  let niks_other = []
  let niks_all = []
  let userFT = []
  const existingData = loadExistingData(); // Загружаем существующие данные
  const existingNicks = new Set();
  const existingDataOther = loadExistingDataOther(); // Загружаем существующие данные
  const existingNicksOther = new Set();

  // Заполняем множество существующими никами
  for (const title in existingData.dump) {
      existingData.dump[title].forEach(nick => existingNicks.add(nick));
  }
  for (const title in existingDataOther.dump) {
      existingDataOther.dump[title].forEach(nick => existingNicksOther.add(nick));
  }

  function getPlayerNames() {
      setTimeout(() => {
          let acc_added = 0;
          let add_users = 0;
          let write_other = 0
          let write_niks = 0
          let write_add_users = 0
          const code = allowedAnarchyValues[currentIndex];
          bot.chat(`/an${code}`);
          console.log(`Anarchy ${code}`);
          setTimeout(async () => {
            const playerNames = Object.keys(bot.players).map(playerName => bot.players[playerName].displayName.extra);
            const UsersFuntime_all = Object.keys(bot.players).map(playerName => bot.players[playerName].username)
            UsersFuntime_all.forEach((name) => {
              niks_other.push(name)
            })
            playerNames.forEach((msgArray) => {
                if (Array.isArray(msgArray)) {
                    const playerNameText = msgArray.map(msg => msg.text).join('');
                    const colors = msgArray.map(msg => msg.color);
                    userFT.push(playerNameText)
                    playername = playerNameText
                    add_users++
                    if (playerNameText.includes('Титан') && colors.includes('#FF4600')) {
                      niks.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Князь') && colors.includes('#FF0000')) {
                      niks.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Князь') && colors.includes('#FCFCFC')) {
                      niks.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Князь') && colors.includes('#FFFFFF')) {
                      niks.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Герцог') && colors.includes('#840303')) {
                      niks.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Герцог') && colors.includes('#CB0000')) {
                      niks.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Принц') && colors.includes('#FF2300')) {
                      niks.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Сквид') && colors.includes('#00FFF7')) {
                      niks_other.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Глава') && colors.includes('#FF7800')) {
                      niks_other.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Аспид') && colors.includes('#00CDFF')) {
                      niks_other.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Барон') && colors.includes('#5CFFE5')) {
                      niks_other.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Герой') && colors.includes('#00FF66')) {
                      niks_other.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Элита') && colors.includes('#CD00FF')) {
                      niks_other.push(playerNameText);
                      acc_added++
                    }
                    if (playerNameText.includes('Страж') && colors.includes('#CDFF00')) {
                      niks_other.push(playerNameText);
                      acc_added++
                    }
                }
            });
            const filePath = 'UsersFuntime.txt';
            await fs.readFile(filePath, 'utf8', (err, data) => {
                if (err) {
                    console.error('Ошибка чтения файла:', err);
                    return;
                }

                userFT.forEach(nik => {
                    const parts = nik.trim().split(" ");
                    if (parts.length > 2) {
                        const title = parts[1]; // Получаем титул
                        const playerName = parts[2]; // Получаем имя игрока
                        const fullNick = `[ICODE]${parts[0]} ${title} ${playerName}[/ICODE]`;

                        // Проверяем, содержится ли полный ник в файле
                        if (!data.includes(fullNick)) {
                            write_add_users++
                            fs.appendFile(filePath, fullNick + '\n', (err) => {
                                if (err) {
                                    console.error('Ошибка записи в файл:', err);
                                } else {
                                }
                            });
                        }
                    }
                });
            });
            await fs.promises.readFile('all_user_ft.txt', 'utf8')
              .then(async (data) => {
                  for (const nik of niks_other) {
                      if (!data.includes(nik) && !nik.includes('⚡')) {
                          write_other++;
                          await fs.promises.appendFile('all_user_ft.txt', nik + '\n')
                              .catch(err => console.error('Ошибка записи в файл:', err));
                      }
                  }
              })
              .catch(err => console.error('Ошибка чтения файла:', err));


            niks.forEach(nik => {
                const parts = nik.trim().split(" ");
                if (parts.length > 2) {
                    const title = parts[1];
                    const playerName = parts[2];

                    if (existingData.dump[title] && !existingNicks.has(playerName)) {
                        existingData.dump[title].push(playerName);
                        write_niks++
                        existingNicks.add(playerName);
                    }
                }
            });
            niks_other.forEach(nik => {
              const parts = nik.trim().split(" ");
              if (parts.length > 2) {
                  const title = parts[1];
                  const playerName = parts[2];

                  if (existingDataOther.dump[title] && !existingNicksOther.has(playerName)) {
                    existingDataOther.dump[title].push(playerName);
                    write_niks++
                    existingNicksOther.add(playerName);
                  }
              }
            });

            await fs.writeFile('output.json', JSON.stringify(existingData, null, 2), (writeErr) => {
              if (writeErr) {
                  console.error('Ошибка при записи файла:', writeErr);
              } else {
              }
            });
            await fs.writeFile('output_other.json', JSON.stringify(existingDataOther, null, 2), (writeErr) => {
              if (writeErr) {
                  console.error('Ошибка при записи файла:', writeErr);
              } else {
              }
          });
          console.log(`Акков добавленно ${write_niks}/${acc_added} за эту анархию всех ников - ${write_add_users}/${add_users} без фильтров добавленно: ${write_other}`);
          acc_added = 0
          add_users = 0
          write_niks = 0
          write_add_users = 0
          currentIndex++;
          if (code >= 604) {
            currentIndex = 0
          }
          getPlayerNames();
        }, 1000);
      }, 1500);
  }
  getPlayerNames();
});

bot.on('packet', (packet) => {
  try {
      if (packet.metadata && packet.metadata.length > 1) {
          bot.oxygenLevel = Math.round(packet.metadata[1].value / 15);
      }
  } catch (error) {
      console.error('Ошибка при обработке пакета:', error);
  }
});

bot.on('kicked', console.log)
bot.on('error', console.log)