129 lines
5.0 KiB
TypeScript
129 lines
5.0 KiB
TypeScript
import { fetchActiveServers, fetchOnlinePlayers, Server } from '../api';
|
||
|
||
/**
|
||
* Проверяет, находится ли указанный игрок онлайн на любом из серверов
|
||
* @param username Имя игрока для проверки
|
||
* @returns {Promise<boolean>} true, если игрок онлайн хотя бы на одном сервере
|
||
*/
|
||
export async function isPlayerOnline(username: string): Promise<boolean> {
|
||
try {
|
||
console.log('Начинаем проверку статуса для:', username);
|
||
|
||
// Получаем список активных серверов (теперь это массив)
|
||
const servers = await fetchActiveServers();
|
||
console.log('Ответ API активных серверов:', servers);
|
||
|
||
// Фильтруем серверы с игроками
|
||
const serversWithPlayers = servers.filter(
|
||
(server) => server.online_players > 0,
|
||
);
|
||
|
||
// Если нет серверов с игроками, игрок точно не онлайн
|
||
if (serversWithPlayers.length === 0) {
|
||
return false;
|
||
}
|
||
|
||
// Проверяем каждый сервер на наличие игрока
|
||
const checkPromises = serversWithPlayers.map(async (server) => {
|
||
try {
|
||
const onlinePlayers = await fetchOnlinePlayers(server.id);
|
||
|
||
// Проверяем, есть ли игрок с указанным именем в списке
|
||
// Предполагая, что онлайн игроки хранятся в массиве online_players
|
||
return (
|
||
Array.isArray(onlinePlayers.online_players) &&
|
||
onlinePlayers.online_players.some(
|
||
(player) => player.username === username,
|
||
)
|
||
);
|
||
} catch (error) {
|
||
console.error(`Ошибка при проверке сервера ${server.id}:`, error);
|
||
return false;
|
||
}
|
||
});
|
||
|
||
// Ожидаем результаты всех проверок
|
||
const results = await Promise.all(checkPromises);
|
||
|
||
// Игрок онлайн, если хотя бы одна проверка вернула true
|
||
return results.some((result) => result);
|
||
} catch (error) {
|
||
console.error('Ошибка при проверке онлайн-статуса игрока:', error);
|
||
return false; // В случае ошибки считаем, что игрок не онлайн
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Проверяет, находится ли указанный игрок онлайн на конкретном сервере
|
||
* @param username Имя игрока для проверки
|
||
* @param serverId ID сервера для проверки
|
||
* @returns {Promise<boolean>} true, если игрок онлайн на указанном сервере
|
||
*/
|
||
export async function isPlayerOnlineOnServer(
|
||
username: string,
|
||
serverId: string,
|
||
): Promise<boolean> {
|
||
try {
|
||
const onlinePlayers = await fetchOnlinePlayers(serverId);
|
||
|
||
return (
|
||
Array.isArray(onlinePlayers.online_players) &&
|
||
onlinePlayers.online_players.some(
|
||
(player) => player.username === username,
|
||
)
|
||
);
|
||
} catch (error) {
|
||
console.error(`Ошибка при проверке игрока на сервере ${serverId}:`, error);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Проверяет, на каком сервере находится игрок
|
||
* @param username Имя игрока для проверки
|
||
* @returns Объект с информацией: онлайн ли игрок и на каком сервере
|
||
*/
|
||
export async function getPlayerServer(
|
||
username: string,
|
||
): Promise<{ online: boolean; server: Server | null }> {
|
||
try {
|
||
// Получаем список активных серверов
|
||
const servers = await fetchActiveServers();
|
||
|
||
// Фильтруем серверы с игроками
|
||
const serversWithPlayers = servers.filter(
|
||
(server) => server.online_players > 0,
|
||
);
|
||
|
||
// Если нет серверов с игроками, игрок точно не онлайн
|
||
if (serversWithPlayers.length === 0) {
|
||
return { online: false, server: null };
|
||
}
|
||
|
||
// Проверяем каждый сервер на наличие игрока
|
||
for (const server of serversWithPlayers) {
|
||
try {
|
||
const onlinePlayers = await fetchOnlinePlayers(server.id);
|
||
|
||
if (
|
||
Array.isArray(onlinePlayers.online_players) &&
|
||
onlinePlayers.online_players.some(
|
||
(player) => player.username === username,
|
||
)
|
||
) {
|
||
// Игрок найден на этом сервере
|
||
return { online: true, server };
|
||
}
|
||
} catch (error) {
|
||
console.error(`Ошибка при проверке сервера ${server.id}:`, error);
|
||
}
|
||
}
|
||
|
||
// Игрок не найден ни на одном сервере
|
||
return { online: false, server: null };
|
||
} catch (error) {
|
||
console.error('Ошибка при проверке сервера игрока:', error);
|
||
return { online: false, server: null };
|
||
}
|
||
}
|