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