Profesyonel Dijital Altyapı · Citymoon Dynamics

Citymoon DynamicsCitymoon Dynamics
HizmetlerGeliştiricilerFiyatlandırmaDocsForumlarİletişim
Giriş YapKayıt Ol

Belgeler

Citymoon Dynamics
Minecraft
Discord
Web Hizmetleri
Ulises Licenses
Sözlük
Sözlük

Ulises Licenses Dokümantasyonu

Minecraft Eklenti Entegrasyonu

1. Yapılandırma Dosyasını Yükle

private void loadAntileakConfig() {
    File krakenDir = getDataFolder();
    if (!krakenDir.exists()) {
        krakenDir.mkdirs();
    }

    File antileakFile = new File(krakenDir, "antileak.yml");
    if (!antileakFile.exists()) {
        try {
            antileakFile.createNewFile();
            this.antileakConfig = YamlConfiguration.loadConfiguration(antileakFile);
            this.antileakConfig.set("license.key", "your-license-key-here");
            this.antileakConfig.save(antileakFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        this.antileakConfig = YamlConfiguration.loadConfiguration(antileakFile);
    }
}

2. Yeniden Deneme Mantığı ile Lisans Doğrulama

private void validateLicense() {
    UlisesLib ulib = new UlisesLib();
    String productId = "myproductid";
    String licenseKey = this.antileakConfig.getString("license.key", "");
   
    boolean licenseValid = false;
    while (!licenseValid) {
        if (ulib.isLicenseValid(productId, licenseKey)) {
            licenseValid = true;
            
            String discordId = ulib.getDiscordId(productId, licenseKey);
            String productName = ulib.getProductName(productId, licenseKey);
            String expiresAt = ulib.getExpirationDate(productId, licenseKey);
            String licenseStatus = ulib.getLicenseStatus(productId, licenseKey);
            
            Bukkit.getConsoleSender().sendMessage(
                ChatColor.GRAY + "[" + ChatColor.DARK_AQUA + "Kraken" + ChatColor.GRAY + "] " +
                ChatColor.DARK_AQUA + "✓ Authentication successful. Powering up Kraken..."
            );
            Bukkit.getConsoleSender().sendMessage(
                ChatColor.GRAY + "[" + ChatColor.DARK_AQUA + "Kraken" + ChatColor.GRAY + "] " +
                ChatColor.GRAY + " » Discord ID: " + ChatColor.AQUA + discordId
            );
            
            loadPlugin();
            
        } else {
            String lastError = ulib.getLastError();
            Bukkit.getConsoleSender().sendMessage(
                ChatColor.GRAY + "[" + ChatColor.DARK_AQUA + "Kraken" + ChatColor.GRAY + "] " +
                ChatColor.RED + "✗ License authentication failed: " + lastError
            );
            
            if (lastError != null && lastError.contains("Unable to connect to the backend server")) {
                Bukkit.getConsoleSender().sendMessage(
                    ChatColor.GRAY + "[" + ChatColor.DARK_AQUA + "Kraken" + ChatColor.GRAY + "] " +
                    ChatColor.YELLOW + "⚠ Retrying connection in 30 seconds..."
                );
                
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    Bukkit.getPluginManager().disablePlugin(this);
                    return;
                }
            } else {
                Bukkit.getPluginManager().disablePlugin(this);
                return;
            }
        }
    }
}

3. Periyodik Güvenlik Kontrolleri

private void startSecurityChecks() {
    ScheduledExecutorService licenseService = Executors.newSingleThreadScheduledExecutor();
    
    licenseService.scheduleAtFixedRate(() -> {
        UlisesLib ulib = new UlisesLib();
        String productId = antileakConfig.getString("license.product-id", "");
        String licenseKey = antileakConfig.getString("license.key", "");
        
        if (!ulib.isLicenseValid(productId, licenseKey)) {
            String lastError = ulib.getLastError();
            Bukkit.getConsoleSender().sendMessage(
                ChatColor.GRAY + "[" + ChatColor.DARK_AQUA + "Kraken" + ChatColor.GRAY + "] " +
                ChatColor.RED + "✗ License validation failed during periodic check."
            );
            
            if (lastError != null && lastError.contains("Unable to connect to the backend server")) {
                Bukkit.getConsoleSender().sendMessage(
                    ChatColor.GRAY + "[" + ChatColor.DARK_AQUA + "Kraken" + ChatColor.GRAY + "] " +
                    ChatColor.YELLOW + "⚠ Will retry in next check cycle..."
                );
            } else {
                Bukkit.getScheduler().runTask(this, () -> Bukkit.getPluginManager().disablePlugin(this));
                licenseService.shutdown();
            }
        } else {
            Bukkit.getConsoleSender().sendMessage(
                ChatColor.GRAY + "[" + ChatColor.DARK_AQUA + "Kraken" + ChatColor.GRAY + "] " +
                ChatColor.GREEN + "✓ License check passed. Status: " + 
                ulib.getLicenseStatus(productId, licenseKey)
            );
        }
    }, 10L, 10L, TimeUnit.MINUTES);
}

Tam Eklenti Örneği

public class KrakenAntiCheat extends JavaPlugin {
    private FileConfiguration antileakConfig;
    
    @Override
    public void onEnable() {
        loadAntileakConfig();
        
        String productId = antileakConfig.getString("license.product-id");
        String licenseKey = antileakConfig.getString("license.key");
        
        if (productId.equals("your-product-id-here") || licenseKey.equals("your-license-key-here")) {
            getLogger().severe("License details not configured. Please edit antileak.yml");
            Bukkit.getPluginManager().disablePlugin(this);
            return;
        }
        
        validateLicense(productId, licenseKey);
    }
    
    private void validateLicense(String productId, String licenseKey) {
        UlisesLib ulib = new UlisesLib();
        
        while (true) {
            if (ulib.isLicenseValid(productId, licenseKey)) {
                String discordId = ulib.getDiscordId(productId, licenseKey);
                String expiresAt = ulib.getExpirationDate(productId, licenseKey);
                
                getLogger().info("License validated for Discord ID: " + discordId);
                getLogger().info("License expires: " + expiresAt);
                
                loadFeatures();
                startPeriodicChecks();
                break;
                
            } else {
                String error = ulib.getLastError();
                getLogger().severe("License validation failed: " + error);
                
                if (error != null && error.contains("Unable to connect to the backend server")) {
                    getLogger().warning("Retrying connection in 30 seconds...");
                    try {
                        Thread.sleep(30000);
                    } catch (InterruptedException e) {
                        Bukkit.getPluginManager().disablePlugin(this);
                        break;
                    }
                } else {
                    Bukkit.getPluginManager().disablePlugin(this);
                    break;
                }
            }
        }
    }
    
    private void startPeriodicChecks() {
        Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> {
            UlisesLib ulib = new UlisesLib();
            String productId = antileakConfig.getString("license.product-id");
            String licenseKey = antileakConfig.getString("license.key");
            
            if (!ulib.isLicenseValid(productId, licenseKey)) {
                String error = ulib.getLastError();
                getLogger().severe("Periodic license check failed: " + error);
                
                if (!error.contains("Unable to connect to the backend server")) {
                    Bukkit.getScheduler().runTask(this, () -> 
                        Bukkit.getPluginManager().disablePlugin(this)
                    );
                }
            } else {
                getLogger().info("Periodic license check passed.");
            }
        }, 20L * 60 * 10, 20L * 60 * 10);
    }
}

Geliştirilmiş API Yöntemleri

String getDiscordId(String productId, String licenseKey)

Lisansla ilişkili Discord ID'sini alır. Doğrulama başarısız olursa null döndürür.

String discordId = ulib.getDiscordId(productId, licenseKey);
// Returns: "1216532655592439862"

String getProductName(String productId, String licenseKey)

Lisansın ürün adını alır. Doğrulama başarısız olursa null döndürür.

String productName = ulib.getProductName(productId, licenseKey);
// Returns: "KrakenAnticheat"

String getExpirationDate(String productId, String licenseKey)

Son kullanma tarihini ISO formatında alır. Doğrulama başarısız olursa null döndürür.

String expiresAt = ulib.getExpirationDate(productId, licenseKey);
// Returns: "2025-12-05T00:00:00.000Z"

String getLicenseStatus(String productId, String licenseKey)

Lisans durumunu (aktif/iptal edildi/süresi doldu) alır. Doğrulama başarısız olursa null döndürür.

String status = ulib.getLicenseStatus(productId, licenseKey);
// Returns: "active"

String getSubType(String productId, String licenseKey)

Lisans alt türünü (Enterprise, Advanced, vb.) alır. Doğrulama başarısız olursa null döndürür.

String subType = ulib.getSubType(productId, licenseKey);
// Returns: "Enterprise"

String getLastError()

Son hata mesajını döndürür. Bağlantı sorunlarını hata ayıklamak için kullanışlıdır.

Bağlantı Yönetimi

Otomatik Yeniden Bağlanma

Kütüphane artık bağlantı sorunlarını otomatik olarak ele alıyor

  • Sonsuz Yeniden Deneme: Backend erişilemez olduğunda, kütüphane başarıya kadar her 30 saniyede bir yeniden dener
  • Açık Mesajlar: Konsol "Backend sunucusuna bağlanılamıyor" mesajını yeniden deneme sayacıyla gösterir
  • Nazik İşleme: Eklentiyi sadece gerçek lisans sorunları için devre dışı bırakır, bağlantı sorunları için değil

Eklenti Geliştiricileri İçin Önemli Not

Eklentiniz bağlantı sorunları sırasında normal çalışmaya devam etmelidir. Eklentiyi sadece gerçek lisans doğrulama hatalarında (süresi doldu, iptal edildi, geçersiz) devre dışı bırakın. Bağlantı sorunları yeniden deneme girişimlerini tetiklemeli, anında kapatmayı değil.

Otomatik Güncelleme Entegrasyonu

UlisesLib güncellemeleri kontrol etmek, en son jar dosyasını indirmek ve bütünlüğünü doğrulamak için yerleşik yöntemler içerir. Tüm güvenlik doğrulamaları (lisans durumu, HWID bağlama, IP limitleri) kütüphane tarafından otomatik olarak ele alınır.

boolean checkForUpdate(String productId, String licenseKey, String currentVersion)

Ürün jar dosyasının daha yeni bir sürümünün mevcut olup olmadığını kontrol eder. Güncelleme varsa true döndürür.

String currentVersion = "1.0.0";
if (ulib.checkForUpdate(productId, licenseKey, currentVersion)) {
    getLogger().info("Update available! Downloading...");
    ulib.downloadUpdate(productId, licenseKey, hwid);
}

File downloadUpdate(String productId, String licenseKey, String hwid)

En son jar dosyasını indirir. İlk indirmede HWID bağlamasını otomatik olarak işler. İndirilen dosyayı veya indirme başarısız olursa null döndürür.

String hwid = ulib._getHwid();
File updatedJar = ulib.downloadUpdate(productId, licenseKey, hwid);
if (updatedJar != null) {
    getLogger().info("Update downloaded: " + updatedJar.getName());
    if (ulib.verifyChecksum(productId, licenseKey, hwid, updatedJar)) {
        getLogger().info("Checksum verified!");
    }
}

boolean verifyChecksum(String productId, String licenseKey, String hwid, File jarFile)

Dosya bütünlüğünü sağlamak için indirilen jar dosyasının SHA-256 checksum'ını doğrular.

File jarFile = new File("plugins/MyPlugin.jar");
boolean valid = ulib.verifyChecksum(productId, licenseKey, hwid, jarFile);
if (!valid) {
    getLogger().warning("Checksum mismatch! File may be corrupted.");
}

String getCurrentVersion(String productId, String licenseKey)

Sunucuda mevcut olan ürün jar dosyasının en son sürüm dizesini döndürür.

String latestVersion = ulib.getCurrentVersion(productId, licenseKey);
getLogger().info("Latest version available: " + latestVersion);

Güvenlik Doğrulamaları

Tüm güncelleme işlemleri otomatik olarak doğrular:

  • Lisans Durumu: Sadece aktif, süresi dolmamış lisanslar güncelleme indirebilir
  • HWID Bağlama: Donanım ID'si ilk indirmede doğrulanır ve lisansa bağlanır
  • IP Limiti: Lisans başına yapılandırılan IP limitini sayar

Tam Otomatik Güncelleme Örneği

private void checkAndApplyUpdate(String productId, String licenseKey) {
    String currentVersion = this.getDescription().getVersion();
    String hwid = ulib.getHardwareId();

    if (ulib.checkForUpdate(productId, licenseKey, currentVersion)) {
        String latestVersion = ulib.getCurrentVersion(productId, licenseKey);
        getLogger().info("New version available: " + latestVersion + " (current: " + currentVersion + ")");

        File updatedJar = ulib.downloadUpdate(productId, licenseKey, hwid);
        if (updatedJar != null) {
            if (ulib.verifyChecksum(productId, licenseKey, hwid, updatedJar)) {
                getLogger().info("Update downloaded and verified successfully!");
                getLogger().info("Restart the server to apply the update.");
            } else {
                getLogger().warning("Checksum verification failed. Update may be corrupted.");
            }
        }
    } else {
        getLogger().info("Plugin is up to date.");
    }
}

En İyi Uygulamalar

✓ Bunu Yapın

  • Bağlantı sorunları için sonsuz yeniden deneme döngüleri kullanın
  • Başarılı doğrulamada detaylı lisans bilgilerini gösterin
  • Periyodik kontrolleri uygulayın (her 10 dakikada bir)
  • Varsayılan değerlerle yapılandırma dosyası oluşturun

✗ Bunu Yapmayın

  • Bağlantı zaman aşımında eklentiyi devre dışı bırakmak
  • Kaynak koda kimlik bilgileri kodlamak
  • Son kullanıcıya hata detaylarını göstermek
  • Doğrulamayı ana iş parçacığında çalıştırmak
Citymoon DynamicsCitymoon Dynamics

Dijital altyapı için gelişmiş çözümler. Minecraft, Discord ve Web Geliştirme uzmanları.

İlgili hizmetler

  • Ulises Licenses
  • Freewings Discord Bot
  • ResistanceCore Plugin

More

  • Rymbo
  • Vulcan + Grim Prime AC Configuration

Navigasyon

  • Hizmetler
  • Etki
  • İletişim

Yasal

  • Gizlilik
  • Şartlar
  • Çerezler
  • footer.refund

© (2026) 2025-2030 Citymoon Dynamics (citymoon.org). Tüm hakları saklıdır.

An international service, made in Uruguay