Помогите Получение UUID по нику

  • Автор темы Автор темы ilya50
  • Дата начала Дата начала

ilya50

Активный участник
Пользователь
Баллы
76
Как можно получить UUID игрока зная только никнейм(при условии что игрока вообще никогда не было на сервере)
 
Разве что некоторые плагины хранят uuid и можно их получить от них, но это работает только с уже игравшими игроками.
Потом нужно будет погуглить про генерацию uuid на пиратке, мб чёт интересное найду
 
PHP:
        String name = "Notch";
        boolean onlineMode = Bukkit.getOnlineMode();
        Long timestamp = null;
        try {
            UUID uuid = MojangAPI.getPlayerUuid(name, onlineMode, null);
            if (uuid == null)
                System.out.println("Игрок с таким ником не существует");
            else
                System.out.println((onlineMode ? "Лицензионный " : "Пиратский") + " UUID игрока " + name + ": " + uuid.toString());

        } catch (IOException e) {
            System.out.println("Не удалось получить UUID игрока + " + name + ". Похоже, сервера Mojang недоступны");
        }
PHP:
    /**
     * @param name       Никнейм игрока
     * @param onlineMode Включить ли запрос UUID с серверов Mojang или сгенерировать
     * @param timestamp  Время в UNIX-формате (без миллисекунд). null для текущего времени
     * @return UUID игрока. Либо null, если игрок не найден на серверах Mojang
     * @throws IOException В случае, если сервера Mojang недоступны или был вернут некорректный ответ
     */
    @Nullable
    public static UUID getPlayerUuid(@Nonnull String name, boolean onlineMode, @Nullable Long timestamp) throws IOException {
        if (!onlineMode) return UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8));
        try (BufferedReader reader = createReader("https://api.mojang.com/users/profiles/minecraft/" + name
                + (timestamp == null ? "" : "?at=" + timestamp))) {
            JsonElement element = readJson(reader);
            if (element == null) return null; //Игрок не найден
            JsonObject jsonObject = element.getAsJsonObject();
            if (jsonObject == null) return null;
            if (!jsonObject.has("id"))
                throw new IOException("Некорректные данные профиля игрока " + name);
            String uuid = jsonObject.get("id").getAsString();
            return parseUUID(uuid, false);
        } catch (IOException e) {
            throw new IOException("Сервера Mojang недоступны", e);
        }
    }

    /**
     * @param reader Ридер, при помощи которого производить чтение
     * @return JsonElement после парсинга или null, если ответ не поступил
     * @throws IOException если не удалось выполнить чтение ридером
     */
    @Nullable
    private static JsonElement readJson(@Nonnull BufferedReader reader) throws IOException {
        String jsonInput = reader.readLine();
        if (jsonInput == null || jsonInput.isEmpty()) return null;
        return new JsonParser().parse(jsonInput);
    }

    /**
     * @param url URL для подключения
     * @return Ридер по указанному URL
     * @throws IOException при приблемах поделючения
     */
    @Nonnull
    private static BufferedReader createReader(@Nonnull String url) throws IOException {
        return new BufferedReader(new InputStreamReader(new URL(url).openStream()));
    }

    /**
     * @param input        Строка с UUID
     * @param hasSplitters Создержит ли строка разделители '-'
     * @return UUID в виде объекта
     */
    @Nonnull
    private static UUID parseUUID(@Nonnull String input, boolean hasSplitters) {
        if (hasSplitters) {
            if (input.length() != 36) throw new IllegalArgumentException("Некорректный UUID: " + input);
        } else {
            if (input.length() != 32) throw new IllegalArgumentException("Некорректный UUID: " + input);
            input = input.replaceAll("(.{8})(.{4})(.{4})(.{4})(.+)", "$1-$2-$3-$4-$5");
        }
        return UUID.fromString(input);
    }
 
Последнее редактирование:
Назад
Верх